如何使用lxml通过文本查找元素?
Posted
技术标签:
【中文标题】如何使用lxml通过文本查找元素?【英文标题】:How to use lxml to find an element by text? 【发布时间】:2012-12-27 07:44:56 【问题描述】:假设我们有以下html:
<html>
<body>
<a href="/1234.html">TEXT A</a>
<a href="/3243.html">TEXT B</a>
<a href="/7445.html">TEXT C</a>
<body>
</html>
如何让它找到包含“TEXT A”的元素“a”?
到目前为止,我得到了:
root = lxml.html.document_fromstring(the_html_above)
e = root.find('.//a')
我试过了:
e = root.find('.//a[@text="TEXT A"]')
但这不起作用,因为“a”标签没有属性“text”。
有什么方法可以以与我尝试过的方法类似的方式解决这个问题?
【问题讨论】:
你试过:contains
吗?
参考unutbu的回答
【参考方案1】:
你很亲密。使用text()=
而不是@text
(表示属性)。
e = root.xpath('.//a[text()="TEXT A"]')
或者,如果你只知道文本包含“TEXT A”,
e = root.xpath('.//a[contains(text(),"TEXT A")]')
或者,如果您只知道文本以“TEXT A”开头,
e = root.xpath('.//a[starts-with(text(),"TEXT A")]')
有关可用字符串函数的更多信息,请参阅the docs。
例如,
import lxml.html as LH
text = '''\
<html>
<body>
<a href="/1234.html">TEXT A</a>
<a href="/3243.html">TEXT B</a>
<a href="/7445.html">TEXT C</a>
<body>
</html>'''
root = LH.fromstring(text)
e = root.xpath('.//a[text()="TEXT A"]')
print(e)
产量
[<Element a at 0xb746d2cc>]
【讨论】:
这给了我 SyntaxError: invalid predicate。 对。find
/findAll
是简化的方法,不允许使用各种 XPath。对于当前版本的 lxml,xpath
接受 XPath 版本 1.0。
糟糕,刚刚删除了您发布之前的评论。我在我的代码中替换了 find 和 findAll 并且它可以工作。再次感谢你:)
我得到 [root.find(
… 而不是root.xpath(
…。【参考方案2】:
另一种对我来说看起来更直接的方式:
results = []
root = lxml.hmtl.fromstring(the_html_above)
for tag in root.iter():
if "TEXT A" in tag.text
results.append(tag)
【讨论】:
如果您正在寻找确切的文本,当然还有tag.text == "TEXT A"
以上是关于如何使用lxml通过文本查找元素?的主要内容,如果未能解决你的问题,请参考以下文章