如何匹配 XPath (lxml) 中元素的内容?

问题描述 投票:0回答:2

我想使用 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”。我收到“语法错误:无效的节点谓词”

python xpath lxml predicate
2个回答
24
投票

我会尝试:

.//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 语法,以及 自定义扩展功能。


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 表示它的查找方法使用相同的受限语法。

© www.soinside.com 2019 - 2024. All rights reserved.