Выбор конкретной таблицы с XPath - PullRequest
3 голосов
/ 19 мая 2009

У меня есть документ XHTML, и я хочу выбрать в нем единственную таблицу с class = "index".

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

//descendant::table[@class="index"]

Похоже, что он не работает при тестировании с xmlstarlet. Мой инструмент сломался или выражение XPath неверно?

Ответы [ 4 ]

4 голосов
/ 19 мая 2009

Я думаю //table[@class="index"] это то, что вы хотите

3 голосов
/ 21 мая 2009

Исходя из вашего примера страницы (metacritic.com/film/highscores.shtml), я бы сказал, что вам нужно использовать:

//TABLE[@CLASS="index"] 
(or /descendant::TABLE[@CLASS="index"])

Это потому, что таблица TABLE with CLASS написана в верхнем регистре на странице примера (XML и XPath чувствительны к регистру).

Это будет работать, если вы нацеливаетесь на определенную страницу, но, вероятно, станет проблемой, если разные страницы используют разные регистры для одинаковых HTML-тегов.

Тогда вам понадобится мерзость, подобная

//TABLE[@CLASS="index" or @class="index" or @Class="index" or ...]
|//table[@CLASS="index" or @class="index" or ...]
|...

Так что вам, вероятно, придется продолжать использовать Tidy, прежде чем извлекать информацию, или переключиться на инструмент, специализирующийся на очистке HTML (вместо XPath)

1 голос
/ 19 мая 2009

Да, ось descendant выбирает все узлы, нисходящие от узла контекста. Но ключ здесь - это контекстный узел.

Например, descendant::span будет извлекать всех span потомков текущего узла. В том же духе descendant::* извлечет все элементы-потомки текущего узла.

Если вам нужно сопоставить таблицу и детей, то указанный вами XPath отлично работает во время моего теста:

//descendant::table[@class="index"]

... выбирает саму таблицу и дочерние узлы.

Если вам нужно только сопоставить дочерние элементы таблицы, сначала сопоставьте нужный вам узел , а затем сопоставьте его потомкам:

//table[@class="index"]/descendant::*

.. Выбирает только дочерние узлы таблицы.

0 голосов
/ 13 июня 2016

используйте этот код

   let $info :=($p//descendant::TABLE[@class="index"])
        return $info
...