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

15 投票
2 回答
24624 浏览
提问于 2025-04-15 21:36

我想用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语法表达式,以及自定义扩展函数。

撰写回答