Подтвердить что ты не робот

Как использовать 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" не имеют атрибута "текст".

Можно ли каким-либо образом решить эту проблему аналогично тому, что я пробовал?

4b9b3361

Ответ 1

Вы очень близки. Используйте text()=, а не @text (который указывает атрибут).

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

Или, если вы знаете только, что текст содержит "ТЕКСТ А",

e = root.xpath('.//a[contains(text(),"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>]

Ответ 2

Другой способ, который выглядит более прямолинейным для меня:

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