Я хочу извлечь содержимое следующего узла 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
Попробуй это:
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()])