如何使用lxml按文本查找元素?

时间:2013-01-13 02:10:25

标签: python html lxml

假设我们有以下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>

如何找到元素“a”,其中包含“TEXT A”?

到目前为止,我已经:

root = lxml.hmtl.document_fromstring(the_html_above)
e = root.find('.//a')

我试过了:

e = root.find('.//a[@text="TEXT A"]')

但这不起作用,因为“a”标签没有属性“text”。

有什么方法可以用与我尝试过的方式类似的方式来解决这个问题吗?

2 个答案:

答案 0 :(得分:39)

你非常接近。使用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>]

答案 1 :(得分:3)

另一种看起来更直截了当的方式:

results = []
root = lxml.hmtl.fromstring(the_html_above)
for tag in root.iter():
    if "TEXT A" in tag.text
        results.append(tag)
相关问题