【问题标题】:How to use lxml to find an element by text?如何使用lxml通过文本查找元素?
【发布时间】: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的回答

标签: python html lxml


【解决方案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 并且它可以工作。再次感谢你:)
  • 我得到 [] 但是当我尝试获取文本时出现此错误 UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 82: invalid start字节请帮助
  • 谢谢。我使用的是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"
猜你喜欢
  • 2020-08-08
  • 1970-01-01
  • 2017-05-02
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 2014-06-27
相关资源
最近更新 更多