diff options
author | Leonard Richardson <leonard.richardson@canonical.com> | 2012-03-01 09:06:25 -0500 |
---|---|---|
committer | Leonard Richardson <leonard.richardson@canonical.com> | 2012-03-01 09:06:25 -0500 |
commit | 4a5136d31bf07a7b28b58343f0c32e41d895e110 (patch) | |
tree | 271f5140137f4143774081ea92d872fc7f95bd92 /bs4 | |
parent | 8bbc84dfc6324a32066b87cf3a78ce0eb719e289 (diff) |
Test that CSS selectors work within the tree as well as at the top level.
Diffstat (limited to 'bs4')
-rw-r--r-- | bs4/element.py | 20 | ||||
-rw-r--r-- | bs4/tests/test_tree.py | 11 |
2 files changed, 22 insertions, 9 deletions
diff --git a/bs4/element.py b/bs4/element.py index 3baafe3..584e171 100644 --- a/bs4/element.py +++ b/bs4/element.py @@ -446,9 +446,11 @@ class PageElement(object): combination. """ if operator == '=': - # string representation of attribute is equal to value + # string representation of `attribute` is equal to `value` return lambda el: el._attr_value_as_string(attribute) == value elif operator == '~': + # space-separated list representation of `attribute` + # contains `value` def _includes_value(element): attribute_value = element.get(attribute, []) if not isinstance(attribute_value, list): @@ -456,17 +458,19 @@ class PageElement(object): return value in attribute_value return _includes_value elif operator == '^': - # string representation of attribute starts with value - return lambda el: el._attr_value_as_string(attribute, '').startswith(value) + # string representation of `attribute` starts with `value` + return lambda el: el._attr_value_as_string( + attribute, '').startswith(value) elif operator == '$': - # string represenation of attribute ends with value - return lambda el: el._attr_value_as_string(attribute, '').endswith(value) + # string represenation of `attribute` ends with `value` + return lambda el: el._attr_value_as_string( + attribute, '').endswith(value) elif operator == '*': - # string representation of attribute contains value + # string representation of `attribute` contains `value` return lambda el: value in el._attr_value_as_string(attribute, '') elif operator == '|': - # string representation of attribute is either exactly - # value or starts with value- + # string representation of `attribute` is either exactly + # `value` or starts with `value` and then a dash. def _is_or_starts_with_dash(element): attribute_value = element._attr_value_as_string(attribute, '') return (attribute_value == value or attribute_value.startswith( diff --git a/bs4/tests/test_tree.py b/bs4/tests/test_tree.py index bfc4218..3f32736 100644 --- a/bs4/tests/test_tree.py +++ b/bs4/tests/test_tree.py @@ -1301,7 +1301,7 @@ class TestNavigableStringSubclasses(SoupTest): self.assertEqual(soup.encode(), b"<!DOCTYPE foo>\n") -class TestSoupSelector(SoupTest): +class TestSoupSelector(TreeTest): HTML = """<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> @@ -1528,3 +1528,12 @@ class TestSoupSelector(SoupTest): ('[blah]', []), ('p[blah]', []), ) + + def test_select_on_element(self): + # Other tests operate on the tree; this operates on an element + # within the tree. + inner = self.soup.find("div", id="main") + selected = inner.select("div") + # The <div id="inner"> tag was selected. The <div id="footer"> + # tag was not. + self.assertSelectsIDs(selected, ['inner']) |