web-dev-qa-db-ja.com

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」を含む要素「a」を検索するにはどうすればよいですか?

これまでのところ私は持っています:

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

私はもう試した:

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

"a"タグには属性 "text"がないため、これは機能しませんでした。

私が試したのと同じような方法でこれを解決できる方法はありますか?

28
user1973386

あなたはとても近いです。 _@text_(属性を示す)ではなくtext()=を使用します。

_e = root.xpath('.//a[text()="TEXT A"]')
_

または、テキストに「テキストA」が含まれていることがわかっている場合は、

_e = root.xpath('.//a[contains(text(),"TEXT A")]')
_

または、「テキスト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>]
_
39
unutbu

私にとってより簡単に見える別の方法:

results = []
root = lxml.hmtl.fromstring(the_html_above)
for tag in root.iter():
    if "TEXT A" in tag.text
        results.append(tag)
3
ToonAlfrink