Xpath для получения второго URL с соответствующим текстом в теге href - PullRequest
4 голосов
/ 12 апреля 2010

На html-странице имеются ссылки на пейджинг, 1 из которых находится вверху страницы, а другой - внизу страницы.

Используя HtmlUnit, в настоящее время я получаю HtmlAnchor на странице, используя getByAnchorText("1");

Существует проблема в некоторых ссылках сверху, поэтому я хочу сослаться на нижние ссылки, используя XPath.

nextPageAnchor = (HtmlAnchor) page.getByXPath("");

Как я могу сослаться на вторую ссылку на странице, используя xpath?

Мне нужно сослаться на ссылку, используя AnchorText, так что ссылка вроде:

<a href="....">33</a>

href имеет произвольный текст и является функцией javascript, поэтому я понятия не имею, что это будет.

Возможно ли это с xpath?

Ответы [ 2 ]

10 голосов
/ 12 апреля 2010

Чтобы выбрать второй элемент a в любом месте документа:

(//a)[2]

Чтобы выбрать второй элемент a с определенным текстом в атрибуте href:

(//a[@href='...'])[2]

Обратите внимание, что паразиты обязательны, и что выражение //a[2] не будет выполнять то, что вы намеревались: оно выберет все элементы a, которые являются вторым элементом a любого родителя. Если вы введете

<p>Link <a href="one.html">One</a></p>
<p>Link <a href="two.html">Two</a> and <a href="three.html">Three</a>.</p>
<p>Link <a href="four.html">Four</a> and <a href="five.html">Five</a>.</p>

(//a)[2] вернет вторую ссылку (two.html), а //a[2] вернет третью и пятую ссылку (three.html и five.html), так как они оба являются вторым a дочерним элементом их родитель.

4 голосов
/ 12 апреля 2010

Все довольно просто:

 (//a)[2]

//a получает все привязки на странице, а [2] получает вторую (она с одним индексом, а не с нулевым индексом, поэтому 2 на самом деле 2-й, а не 3-й, как вы ожидаете с массивом) например)

Если вы хотите получить ссылку с текстом 33, вы можете использовать:

 //a[./text() = "33"]

См. http://www.w3.org/TR/xpath/ для полного определения xpath.

EDIT

Чтобы ответить на комментарий Александра, вы можете использовать

 (//a[./text() = "33"])[2]

Сначала будут выбраны все теги <a> с текстом 33, а затем будут выбраны вторые из них.

РЕДАКТИРОВАТЬ 2

ПРИМЕЧАНИЕ. Путь местоположения // para [1] не означает то же самое, что путь местоположения / потомок :: para [1]. Последний выбирает первый дочерний элемент para; первый выбирает все элементы-потомки, которые являются первыми детьми-потомками своих родителей.

Маркус действительно прав. Цитата выше взята из определения xPath, указанного выше.

...