12

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

4

1 回答 1

20

我会尝试:

.//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 语法中的表达式,以及自定义扩展函数。

于 2010-04-14T13:54:02.127 回答