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-страница сильно напичкана всем и вся и, естественно, такой костыль бьет по производительности, да и решение это, мягко говоря, такое себе… Чувствую, должно быть элегантное решение, просто я чего-то не знаю..?
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP