如何在XPath中匹配元素内容(lxml)?
我想用lxml和XPath表达式来解析HTML。我的问题是如何匹配标签的内容:
比如说,给定这个
<a href="http://something">Example</a>
元素,我可以用
.//a[@href='http://something']
来匹配href属性,但如果用下面的表达式
.//a[.='Example']
甚至是
.//a[contains(.,'Example')]
lxml就会抛出“无效节点谓词”的异常。
我哪里做错了呢?
编辑:
示例代码:
from lxml import etree
from cStringIO import StringIO
html = '<a href="http://something">Example</a>'
parser = etree.HTMLParser()
tree = etree.parse(StringIO(html), parser)
print tree.find(".//a[text()='Example']").tag
我期望的输出是'a',但我得到了'SyntaxError: invalid node predicate'
2 个回答
0
目前被接受的答案在性能上有一些缺点。可以考虑使用:
xml_doc.finditer('.//element[.="text to match"]')
来替代。
这在原始的 xml.ElementTree 实现的查找语法文档中有说明,具体可以查看这里:https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax,而 lxml.etree 也表示它的查找方法使用相同的限制语法。
24
我会尝试用:
.//a[text()='Example']
来使用xpath()方法:
tree.xpath(".//a[text()='Example']")[0].tag
如果你想用iterfind()、findall()、find()、findtext()这些方法,记得高级功能,比如值比较和函数在ElementPath中是不可用的。
lxml.etree支持在ElementTree和Element上使用find、findall和findtext方法的简单路径语法,这些都是从原来的ElementTree库(ElementPath)中来的。作为lxml的一个特定扩展,这些类还提供了一个xpath()方法,支持完整的XPath语法表达式,以及自定义扩展函数。