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

14
我想使用XPath表达式在lxml中解析HTML。我的问题是匹配标签内容:

例如,给定

<a href="http://something">Example</a>

我可以使用什么元素来匹配 href 属性?

.//a[@href='http://something']

但是鉴于表达式

.//a[.='Example']

甚至更多

.//a[contains(.,'Example')]
抛出“invalid node predicate”异常。 我做错了什么? 编辑: 示例代码:
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
你可以使用etree.fromstring()来解析你的HTML,而不是使用StringIO。 - Snakes and Coffee
1个回答

23
我会尝试使用以下代码: .//a[text()='Example'] 使用xpath()方法:
tree.xpath(".//a[text()='Example']")[0].tag

如果您想使用iterfind()、findall()、find()或findtext(),请记住ElementPath不支持高级功能,如值比较和函数。 支持ElementTree和Element上的find、findall和findtext方法的简单路径语法,这些方法与原始的ElementTree库(ElementPath)相同。作为lxml特定的扩展,这些类还提供了一个xpath()方法,支持完整XPath语法中的表达式,以及自定义扩展函数。

我不想基于href来查找链接,而是基于它所包含的文本:“Example”在上面的例子中 :).//a[@href='http://something']按照现有方式工作... - akosch
1
//a[text()='示例'] - Greg
谢谢您的建议,但是这个也会引发“SyntaxError: invalid node predicate”的错误。 - akosch
谢谢:使用XPath()确实有效。奇怪的是,@href在两种情况下都有效。 - akosch
@systempuntoout 那么在这种情况下,.//a[text()='Example'] 是无效的吗? - SIslam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接