2013-09-23 3 views
6

Я разборе веб-страницу, которая включает в себя структуру, как это:XPath: найти ячейку таблицы с одной позиции в другую строку

<tr> 
    <td>Label 1</td> 
    <td>Label 2</td> 
    <td>Label 3</td> 
    <td>Something else</td> 
<\tr> 
<tr> 
    <td>Item 1</td> 
    <td>Item 2</td> 
    <td>Item 3</td> 
<\tr> 

Что мне нужно сделать, это выбрать элемент на основе его этикетке, так что мои мысли если метка находится в третьем теге в своей строке, я могу захватить третий тег в следующей строке, чтобы найти элемент. Я не могу найти способ использовать функцию position() таким образом, и, возможно, xpath (1.0) не сможет обработать этот тип фильтрации.

Моя лучшая попытка: //td[ancestor::tr[1]/preceding-sibling::tr[1]/td[position()]]. Я надеялся, что функция position() захватит позицию <td> в начале xpath, так как остальная часть xpath является фильтром для этого узла.

Является ли то, что я пытаюсь сделать, даже возможно?

+2

Какую библиотеку/язык программирования вы используете для выполнения своих XPaths? Я не думаю, что это можно сделать в чистом XPath 1.0, вам нужно будет хранить 'position()' из внешнего контекста в переменной, а затем использовать эту переменную внутри предиката, а также то, как вы устанавливаете переменные, варьируется от инструмента к инструменту. –

+0

Я использую selenium webdriver. – eldon111

+0

Какие языковые привязки selenium-webdriver вы используете? Вероятнее всего, проще использовать различные методы селена, а не чистое решение xpath. –

ответ

5

Вы на правильном пути - да, вы можете использовать position() вместе с count().

Чтобы выбрать текст Item 2 данный Label 2:

//td[. = 'Label 2']/../following-sibling::tr/td[position() = count(//td[. = 'Label 2']/preceding-sibling::td)+1]/text() 

Пояснение: Выберите энный ячейку, в которой п задается числом двойников клеток, которые существуют до клетки, которая имеет желаемому в предыдущей строке. Фактически, используйте функцию count() для определения положения в строке метки и затем выберите соответствующую ячейку в следующей строке вниз, сопоставляя ее с position().

+0

Проблема в том, что мне нужно захватить соответствующий элемент из соседнего тега ''. Как и для «Метка 2», верните «Пункт 2». – eldon111

+0

А, это немного сложнее, но также выполнимо. См. Обновленный ответ выше. – kjhughes

Смежные вопросы