TransWikia.com

Игнорирование определенных тегов в XPath lxml

Stack Overflow на русском Asked by Evgeniy Porovozoff on November 15, 2021

Подскажите, пожалуйста, возможно ли как-то игнорировать определенные html-теги, находящиеся внутри текста при разборе XPath? В моем случае это тег <br>. Пример:

from lxml import html


def main():
    html_page = '''
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <title>Document</title>
</head>
<body>

<div id="table">
    <h3>Table title</h3>

    <div>
        <div><span>Title item 1</span></div>
        <span>Item 1</span>
    </div>

    <div>
        <div><span>Title item 2</span></div>
        <span>Item 2<br>Item 2.1<br>Item 2.2</span>
    </div>

    <div>
        <div><span>Title item 3</span></div>
        <span>Item 3</span>
    </div>

    <div>
        <div><span>Title item 4</span></div>
        <span>Item 4</span>
    </div>

</div>

</body>
</html>
'''
    tree = html.document_fromstring(html_page)

    item_titles = tree.xpath('//div[@id="table"]/div/div/span/text()')
    item_values = tree.xpath('//div[@id="table"]/div/span/text()')

    print(item_titles)
    print(item_values)


if __name__ == '__main__':
    main()

Вывод будет таким:

['Title item 1', 'Title item 2', 'Title item 3', 'Title item 4']
['Item 1', 'Item 2', 'Item 2.1', 'Item 2.2', 'Item 3', 'Item 4']

а мне нужен такой:

['Title item 1', 'Title item 2', 'Title item 3', 'Title item 4']
['Item 1', 'Item 2 Item 2.1 Item 2.2', 'Item 3', 'Item 4']

т.е. из-за находящегося среди текста <span>Item 2<br>Item 2.1<br>Item 2.2</span> тега <br> результат разбивается на отдельные элементы списка, что в моем случае совсем неправильно, т.к. Item 2<br>Item 2.1<br>Item 2.2 являются элементами одного значения.

Я делал свой ламерский костыль в виде replace():

temp = html_page.replace('<br>', ' ')
tree = html.document_fromstring(temp)

но реальная html-страница сильно напичкана всем и вся и, естественно, такой костыль бьет по производительности, да и решение это, мягко говоря, такое себе… Чувствую, должно быть элегантное решение, просто я чего-то не знаю..?

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP