Allow restricting results to descendants of a particular tag

This commit is contained in:
Kovid Goyal 2015-02-21 10:56:24 +05:30
parent e7caf265c1
commit bd3b162d7a

View File

@ -156,13 +156,19 @@ class Select(object):
return ascii_lower(x.rpartition('}')[2]) return ascii_lower(x.rpartition('}')[2])
self.map_tag_name = map_tag_name self.map_tag_name = map_tag_name
def __call__(self, selector): def __call__(self, selector, root=None):
'Return an iterator over all matching tags, in document order.' ''' Return an iterator over all matching tags, in document order.
Normally, all matching tags in the document are returned, is you
specify root, then only tags that are root or descendants of root are
returned. Note that this can be very expensive if root has a lot of
descendants. '''
seen = set() seen = set()
if root is not None:
root = frozenset(self.itertag(root))
for selector in get_parsed_selector(selector): for selector in get_parsed_selector(selector):
parsed_selector = selector.parsed_tree parsed_selector = selector.parsed_tree
for item in self.iterparsedselector(parsed_selector): for item in self.iterparsedselector(parsed_selector):
if item not in seen: if item not in seen and (root is None or item in root):
yield item yield item
seen.add(item) seen.add(item)