XPath получение текста от элемента после определенного элемента - PullRequest
5 голосов
/ 16 ноября 2010

Так что сейчас, если у меня есть что-то вроде этого:

//div[@class='artist']/p[x]/text()

x может быть 3 или 4, или, может быть, даже другое число.К счастью, если то, что я ищу, не в 3, я могу просто проверить на ноль и продолжать, пока не найду текст.Проблема в том, что я предпочел бы знать, что каждый раз обращаюсь к правильному элементу.Поэтому я попробовал это:

div[@class='people']/h3[text()='h3 text']/p/text()

, поскольку сразу после <h3>h3 text</h3> всегда будет <p>.Однако это никогда ничего не возвращает, и обычно приводит к ошибке.Если я удалю / p, я получу возвращенный 'h3 текст'.

В любом случае, как мне получить <p> непосредственно после <h3>?

Кстати, я использую HTMLCleaner вЯва для этого.

Ответы [ 2 ]

10 голосов
/ 16 ноября 2010

По умолчанию, когда вы не указываете ось , вы получаете ось child::, поэтому оператор /, похоже, опускает дочернее дерево DOM. Подразумевается child:: после каждого слэша.

В вашем случае вы не хотите найти ребенка из <div>, вы хотите найти родного брата . Брат или сестра - это элемент на том же уровне вложенности. В частности, вы должны использовать ось following-sibling::.

div[@class='people']/h3[text()='h3 text']/following-sibling::p/text()

Оси XPath

Оси - это расширенная функция XPath. Они являются одной из функций, которые делают XPath особенно мощным.

Вы уже знакомы с еще одной осью, хотя, возможно, не осознали этого: символ @ является сокращением для attribute::. Когда вы пишете @href, вы на самом деле говорите attribute::href, как при поиске атрибута с именем "href" вместо child .

Оси, а? Сокращения, а? Скажи мне больше, говоришь? OK!

  • . и .. - сокращение для более многословных self::node() и parent::node() соответственно. Вы можете использовать более длинные формы, если хотите.

  • Оператор //, который вы обычно видите как //p или body//a, имеет скрытый descendant-or-self::node() между слешами. //p является сокращением для /descendant-or-self::node()/p.

1 голос
/ 16 ноября 2010

В любом случае, как мне это получить <p> сразу после <h3>?

Используйте

div[@class='people']/h3[text()='h3 text']/following-sibling::p[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...