Xpath - Как выбрать связанные данные двоюродного брата
128 просмотра
2 ответа
<html>
<table border="1">
<tbody>
<tr>
<td>
<table border="1">
<tbody>
<tr>
<th>aaa</th>
<th>bbb</th>
<th>ccc</th>
<th>ddd</th>
<th>eee</th>
<th>fff</th>
</tr>
<tr>
<td>111</td>
<td>222</td>
<td>333</td>
<td>444</td>
<td>555</td>
<td>666</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</html>
Как я могу выбрать конкретные связанные данные двоюродного брата с помощью xpath, желаемый результат будет:
<th>aaa</th>
<th>ccc</th>
<th>fff</th>
<td>111</td>
<td>333</th>
<td>666</td>
Наиболее важным аспектом xpath является то, что я хочу иметь возможность включать или исключать определенные <th>
теги и соответствующие <td>
теги
Итак, на основании ответов, наиболее близких мне:
//th[not(contains(text(), "ddd"))] | //tr[2]/td[not(position()=4)]
Есть ли способ не использовать явно, position()=4
но вместо этого ссылаться на соответствующий th
тег
Ответы (2)
0 плюса
Я не уверен, что это лучшее решение, но вы можете попробовать
//th[not(.="bbb") and not(.="ddd") and not(.="eee")] | //tr[2]/td[not(position()=index-of(//th, "bbb")) and not(position()=index-of(//th, "ddd")) and not(position()=index-of(//th, "eee"))]
или более короткая версия
//th[not(.=("bbb", "ddd", "eee"))]| //tr[2]/td[not(position()=(index-of(//th, "bbb"), index-of(//th, "ddd"),index-of(//th, "eee")))]
<th>aaa</th>
<th>ccc</th>
<th>fff</th>
<td>111</td>
<td>333</td>
<td>666</td>
Вы можете избежать использования сложных XPath
выражений для получения необходимого результата. Попробуйте использовать Python
+ Selenium
функции вместо:
# Get list of th elements
th_elements = driver.find_elements_by_xpath('//th')
# Get list of td elements
td_elements = driver.find_elements_by_xpath('//tr[2]/td')
# Get indexes of required th elements - [0, 2, 5]
ok_index = [th_elements.index(i) for i in th_elements if i.text not in ('bbb', 'ddd', 'eee')]
for i in ok_index:
print(th_elements[i].text)
for i in ok_index:
print(td_elements[i].text)
Выход
'aaa'
'ccc'
'fff'
'111'
'333'
'666'
Если вам нужно XPath 1.0
решение:
//th[not(.=("bbb", "ddd", "eee"))]| //tr[2]/td[not(position()=(count(//th[.="bbb"]/preceding-sibling::th)+1, count(//th[.="ddd"]/preceding-sibling::th)+1, count(//th[.="eee"]/preceding-sibling::th)+1))]
Автор: Andersson
Размещён: 05.06.2017 03:48
1 плюс
Используя XPath 3.0, вы можете структурировать это в
let $th := //table/tbody/tr[1]/th,
$filteredTh := $th[not(. = ("bbb", "ddd", "eee"))],
$pos := $filteredTh!index-of($th, .)
return ($filteredTh, //table/tbody/tr[position() gt 1]/td[position() = $pos])
Автор: Martin Honnen
Размещён: 05.06.2017 04:11
Вопросы из категории :
- xpath Какой правильный XPath для выбора атрибутов, которые содержат «foo»?
- xpath Создать XML-узлы на основе XPath?
- xpath XPath выберите узел с пространством имен
- xpath Использование Xpath с пространством имен по умолчанию в C #
- xpath Как я могу преобразовать строку в верхний или нижний регистр с помощью XSLT?
- xpath Как разобрать XML в Bash?
- xpath Сопоставление узла на основе значения брата с XPath
- xpath Selenium xpath flow
- xpath Как получить NameTable из XDocument?
- xpath SimpleXML: выбор элементов, имеющих определенное значение атрибута
- xpath-1.0 Проверьте тип узла в шаблоне XSL
- xpath-1.0 Как использовать начальный-с (), содержит () и заканчивается-в () в XPath, чтобы найти внутренний текст XML-узла? в XPATH 1.0
- xpath-1.0 XPath 1.0: используйте значение атрибута родителя текущего узла, чтобы найти другой соответствующий узел
- xpath-1.0 Могу ли я рефакторинг, чтобы избежать "self ::" и "parent ::"?
- xpath-1.0 Средние числа от нечистых узлов, использующих чистый xpath 1.0
- xpath-1.0 Почему XPath поверх System.Xml.XmlDocument не находит смежные узлы текста и CData?
- xpath-1.0 мои данные не обновляются на онлайн-сервере. данные обновляются на локальном сервере
- xpath-1.0 Выбрать атрибут через XPath, только если дочерний элемент не существует?
- xpath-1.0 Как включить разрыв строки в выражении XPath?
- xpath-1.0 Функция XPath на нескольких текстовых узлах