我想使用 XPath 表达式通过 lxml 解析 HTML。我的问题是匹配标签的内容:
例如给定
<a href="http://something">Example</a>
元素我可以使用
来匹配 href 属性.//a[@href='http://something']
但是给定的表达式
.//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”。我收到“语法错误:无效的节点谓词”
我会尝试:
.//a[text()='Example']
使用 xpath() 方法:
tree.xpath(".//a[text()='Example']")[0].tag
如果您想使用 iterfind()、findall()、find()、findtext(),请记住,ElementPath中不提供值比较和函数等高级功能。
lxml.etree支持简单路径 find、findall 和 的语法 ElementTree 上的 findtext 方法和 元素,从原文可知 ElementTree 库(ElementPath)。作为 lxml 特定扩展,这些 类还提供 xpath() 方法 支持表达式 完整的 XPath 语法,以及 自定义扩展功能。
当前接受的答案存在性能缺陷。考虑使用:
xml_doc.finditer('.//element[.="text to match"]')
相反。
这在原始 xml.ElementTree 实现的查找语法文档中进行了记录:https://docs.python.org/3/library/xml.etree.elementtree.html#supported-xpath-syntax lxml.etree 表示它的查找方法使用相同的受限语法。