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

1

Я хочу извлечь содержимое следующего узла 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

  • 0
    Просто удалите часть, которую вы не хотите с регулярным выражением
  • 0
    спасибо, я использовал принятый ответ 8 месяцев назад, и это решило мою проблему
Теги:
xpath
parsing
html-parsing
lxml

1 ответ

1
Лучший ответ

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

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()])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню