Объединение нескольких результатов одного запроса XPath - PullRequest
0 голосов
/ 26 ноября 2018

С учетом следующей таблицы HTML:

<table>
    <tbody>
        <tr>
            <td>
                <a href="">Example 1</a>
                , 
                <a href="">Example 2</a>
            </td>
        </tr>
        <tr>
            <td>
                <a href="">Example 1</a>
                , 
                <a href="">Example 2</a>
                , 
                <a href="">Example 3</a>
            </td>
        </tr>
        <!-- ... -->
        <!-- Variable amount of rows with variable amount of anchor texts -->
        <!-- ... -->
    </tbody>
 </table>

Можно ли получить следующие результаты из одного запроса XPath?

  1. Example 1, Example 2

  2. Example 1, Example 2, Example 3


Я пытался:

string(/table/tbody/tr/td//node())

Это очевидно не работает по следующей причине:

string (object?)

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

- Википедия


EDIT

Я использую поддержку PHP XPath , которая поддерживает только v1.0.

Запрос XPath предназначен для вставкипользователем в файле конфигурации библиотеки веб-скребка, которую я создаю.

1 Ответ

0 голосов
/ 26 ноября 2018

В XPath 2.0 вы можете сделать

//tr/string-join(.//a/text(), ", ")

или

//tr/string(normalize-space(td))

до получить вывод

Example 1, Example 2
Example 1, Example 2, Example 3

Вы также можете использоватьлиб / функции языка программирования для получения результата (если вам нужно решение XPath 1.0).Например, используя Python lxml.html

for tr in source.xpath('//tr'):
    print(', '.join([a.text for a in tr.xpath('./td/a')]))
...