Подтвердить что ты не робот

XPath - выберите первый элемент после некоторого другого элемента

Я новичок в XPath, сейчас занимаюсь этим несколько часов, поэтому я не совсем уверен, что вы можете сделать с ним что-то вроде следующего.

Хорошо, вот сценарий: Я хочу найти ссылку со страницы. Эта ссылка распознается только текстовым значением, т.е. текст между <a> теги (< a href= "#" > эта ссылка <a> ). До сих пор мне удалось получить связь с элементами этого текста, единственная проблема в том, что некоторые из них лежат вокруг.

Эти ссылки найдены из неупорядоченных списков, которым предшествует другой тег ссылки, который будет служить действительно хорошим "якорем" , чтобы начать поиск конечного элемента, который я хочу найти ( т.е. тогда я мог бы просто принять первый, который соответствует)

Чтобы немного прояснить ситуацию, вот пример того, что происходит:

<a href="#">first dropdown menu</a>
<ul>
  <li><a href="#">some link</a></li>
  <li><a href="#">link i want to find</a></li>
</ul>

<-- *And i would actually want to find the thing from this list* --> 
<a href="#">second dropdown menu</a>
<ul>
  <li><a href="#">some link</a></li>
  <li><a href="#">link i want to find</a></li>
</ul>

И я должен, вероятно, указать, что я хочу получить только один результат или набор результатов, причем первым элементом является "правильный" элемент - элемент, который я хочу найти.

EDIT: На этот вопрос уже был дан ответ, но были некоторые комментарии, которые я должен указать немного больше, чтобы люди могли понять вопрос;)

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

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

Это в основном это. Я знаю, что это все еще сложно понять, но, к сожалению, мне сложно усложнять это объяснение. Я уверен, что кто-то другой может сделать лучшую работу, и если это произойдет, я более чем счастлив включить это описание здесь.

4b9b3361

Ответ 1

Мне пришлось прочесть ваш вопрос пару раз, но я думаю, что понимаю. Что вас интересует, это предикаты. Предикаты позволяют вам выбирать узлы на основе условий.

Например, вы можете сделать:

//a[text()='second dropdown menu']/following::ul[1]/li/a[text()='link i want to find']

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

Кроме того, вы можете указать позиционный индекс в наборе результатов, следующий XPath - это демонстрация (но это не решит вашу проблему):

//a[text()='first dropdown menu']/ul/li[last()]/a/text()

или вы можете использовать оси для навигации по родным/дочерним/детям:

//a[ancestor::ul/preceding::a[1]/text() = 'second dropdown menu']/text()

Итак, я не уверен, что я полностью понял ваш вопрос, но это должно помочь вам написать свой XPath.

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

Ответ 2

так что я понимаю это правильно: вам нужно "некоторая ссылка" node после "второго раскрывающегося меню"

ul[preceding::a[text()='second dropdown menu' and position()=last()]]/li/a[text()='link i want to find']

это должно сделать трюк (я не уверен на 100%, что вам нужно будет проверить позицию() = 1, но я думаю, что если вы опустите его, он будет соответствовать всем следующим ul, поскольку предыдущий - это "все", предшествующие узлы - это зависит от остальной части вашей структуры xml)

Ответ 3

Исправьте меня, если я ошибаюсь - вам нужно выбрать "второе выпадающее меню" из приведенного выше примера, но текст можно дублировать, поэтому вам нужно только второе. XPath:

//a[text()='second drop down menu'][2]