XPath дискриминационное извлечение текста - PullRequest
0 голосов
/ 13 января 2020

Давайте предположим, что у меня есть селектор XPath, указывающий на следующий фрагмент HTML:

<div>
    <p>Hello <a href="foo">fantastic</a> world</p>
    <table>
        <tr>
            <td>first</td>
            <td>row</td>
        </tr>
        <tr>
            <td>second</td>
            <td>row</td>
        </tr>
    </table>
</div>

Я хотел бы извлечь из него текст таким образом, чтобы игнорировать только теги <a>, поэтому я получит:

['Hello fantastic world', 'first', 'row', 'second', 'row']. 

Обратите внимание, что fantastic был обработан так, как если бы он принадлежал тегу <p>.

Проблема в том, что:

  • с selector.xpath('.//text()').extract(), я получаю

    ['Hello', 'fantastic', 'world', 'first', 'row', 'second', 'row']

  • с 'selector.xpath(string(./)).extract()', я получаю

    ['Hello fantastic world first row second row']

Если кто-нибудь знает, как взломать это, это будет высоко ценится!

Ответы [ 2 ]

2 голосов
/ 13 января 2020

В этом XPath

//*[not(self::a)][not(*) or a]

будут выбраны все элементы, кроме a элементов, которые не имеют дочерних элементов или только a дочерних элементов:

<p>Hello <a href="foo">fantastic</a> world</p>
<td>first</td>
<td>row</td>
<td>second</td>
<td>row</td>

В XPath 2.0 , принять строковые значения этих элементов непосредственно в XPath:

//*[not(self::a)][not(*) or a]/string()

Результат в соответствии с запросом:

Hello fantastic world
first
row
second
row

В XPath 1.0 , итерация над результатами и извлеките строковые значения на языке хостинга.

1 голос
/ 14 января 2020

И еще одна альтернатива xpath 2.0:

//(p,//td)/string()

Тот же вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...