Выберите весь текст из следующего узла с дочерними узлами, используя запрос xpath в python

63
6

Я хочу извлечь содержимое следующего узла a tag с XPath в python. до сих пор мне удается извлечь содержимое без внутреннего тега. проблема в том, что мой метод не работает, если следующий узел имеет в нем дочерний узел. Я использую пакет lxml, и вот мой код:

from lxml.html import etree, fromstring

reference_titles = root.xpath("//table[@id='vulnrefstable']/tr/td")
for tree in reference_titles:
a_tag = tree.xpath('a/@href')[0]
title = tree.xpath('a/following-sibling::text()')

это работает для этого html:

<tr>

<td class="r_average">

<a href="http://somelink.com" target="_blank" title="External url">
http://somelink.com
</a>
<br/> SECUNIA 27633
</td>

</tr>

Здесь заголовок правильно "SECUNIA 27633", но в этом html:

<tr>

<td class="r_average">

<a href="http://somelink.com" target="_blank" title="External url">
http://somelink.com
</a>
<br/> SECUNIA 27633 <i>Release Date:</i> tomorrow
</td>

</tr>

В результате "SECUNIA 27633 завтра"

Как я могу извлечь "SECUNIA 27633 Дата выпуска: завтра"?

EDIT: использование node() вместо text() в XPath возвращает все узлы в нем. поэтому я использую это и создаю финальную строку с вложенным выражением for

title = tree.xpath('a/following-sibling::node()')

но я хочу знать, есть ли лучший способ просто извлечь текстовый контент независимо от дочерних узлов с помощью запроса XPath

спросил(а) 2021-01-25T17:20:27+03:00 4 месяца, 2 недели назад
1
Решение
63

Попробуй это:

for tree in reference_titles:
a_tag = tree.xpath('a/@href')[0]
title = " ".join([node.strip() for node in tree.xpath('.//text()[not(parent::a)]') if node.strip()])

ответил(а) 2021-01-25T17:20:27+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема