Объединение нескольких результатов одного запроса XPath

Учитывая следующую 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())

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

строка(объект?)

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

-- Википедия


ИЗМЕНИТЬ

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

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


person ClemC    schedule 26.11.2018    source источник


Ответы (1)


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

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

or

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

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

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

Отлично, я подтверждаю, что ваше первое решение XPath 2 работает должным образом. Однако я просто понимаю, что язык, на котором я сейчас работаю (PHP), не поддерживает XPath 2 и вряд ли будет поддерживать его в ближайшее время. К сожалению, спецификации не позволяют мне добиться этого, используя языковые функции, как вы предложили... Этот запрос XPath предназначен для вставки пользователем в файл конфигурации веб-скребка, который я создаю для него... Спасибо за твое время. Я приму ваш ответ позже, если ни один новый ответ не подойдет лучше для моего отредактированного вопроса.

for tr in source.xpath('//tr'):
    print(', '.join([a.text for a in tr.xpath('./td/a')]))
person Andersson    schedule 26.11.2018
comment
в получить вывод - person ClemC; 26.11.2018