34

次の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>

「TEXTA」を含む要素「a」を検索するにはどうすればよいですか?

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

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

私はもう試した:

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

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

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

4

2 に答える 2

53

あなたはとても近いです。(属性を示す)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")]')

使用可能な文字列関数の詳細については、ドキュメントを参照してください。


例えば、

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>]
于 2013-01-13T02:14:37.760 に答える
8

私にはもっと簡単に見える別の方法:

results = []
root = lxml.hmtl.fromstring(the_html_above)
for tag in root.iter():
    if "TEXT A" in tag.text
        results.append(tag)
于 2013-07-20T17:21:53.873 に答える