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

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

Как мне извлечь "SECUNIA 27633 Release Date: tomorrow"?


РЕДАКТИРОВАТЬ: использование node() вместо text() в XPath возвращает все узлы в нем. поэтому я использую это и создаю последнюю строку с вложенным for оператором

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

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

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Вы можете использовать это:

reference_list = {'title': list(), 'link': list()}
reference_titles = root.xpath("//table[@id='vulnrefstable']/tr/td")
for tree in reference_titles:
    reference_list['link'].append(str(tree.xpath('a/@href')[0]))
    reference_list['title'].append(str(" ".join(
        [node.strip() for node in tree.xpath('.//text()[not(parent::strong) and not(parent::a)]') if
         node]).strip()))
0 голосов
/ 05 июля 2018

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

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