我需要使用lxml.html
获取包含文本的所有标记。我一直在使用{e.tag for e in doc.xpath('.//*[text()= true()]')}
,但text()
中的通配符和lxml
查询都非常慢。是否有更快的方法来做到这一点。
答案 0 :(得分:1)
你可以试试这个:
>>> import itertools
>>> [e.tag for e in itertools.ifilter(lambda x: x.text,doc.findall('.//'))]
不确定它是否更快,但它避免了你提到的两件事(XPath通配符和text()
功能)。
如果你只想使用列表(而不是迭代器),那么这种语法就更简单了:
>>> filter(lambda x: x.text,doc.findall('.//'))
如果你在找到它时处理每个标记(很可能更快),你应该使用迭代器。
答案 1 :(得分:1)
获取一组标签名称,其元素包含一些文本:
tags = {e.tag for e in doc.iter() if e.text}