Возможно, что-то еще происходит (я не изучал образец документа внимательно), но ваш селектор CSS и XPath не эквивалентны.
CSS tr a
- это //tr//a
в XPath. .//tr/*/a
означает (концептуально, а не точно):
.
: текущий узел
//
: все потомки текущего узла
tr
: все tr элементов среди всех потомков текущего узла
/
: все найденные дети tr элементов
*
: любой элемент среди найденных потомков tr elements
/
: найдены все дочерние элементы любого дочернего элемента tr elements
a
: все a элементы, которые являются дочерними элементами элемента потомков элемента tr элемента
Другими словами, с учетом следующего HTML:
<ul>
<li><a href="link1"></a><li>
<li><b><a href="link2"></a></b><li>
</ul>
//ul/*/a
будет соответствовать только link1 .
XPath Primer
На самом деле «XPath» представляет собой серию шагов определения местоположения , разделенных косыми чертами. Шаг локации состоит из:
- Ось (например, child ::)
- Тест узла (либо имя узла, либо один из специальных типов узлов, например,
node()
, text()
)
- Необязательные предикаты (в окружении
[]
. Узел сопоставляется, только если все предикаты верны.)
Если бы мы разложили .//tr/*/a
на шаги его расположения, это выглядело бы так:
.
- ("пробел" между косыми чертами в "//")
tr
*
a
Вероятно, не очевидно, какого черта я говорю. Это потому, что XPath имеет сокращенный синтаксис. Вот выражение с расширенными аббревиатурами (ось и тест узла разделены ::
, шаги - /
):
self::node()/descendent-or-self::node()/child::tr/child::*/child::a
(Обратите внимание, что self::node()
является избыточным.)
Концептуально, что происходит на шаге:
- с учетом набора узлов контекста (по умолчанию это текущий узел или '/' для корневого узла)
- Для каждого узла контекста создайте набор узлов, которые удовлетворяют этапу размещения
- Объединение всех наборов узлов для контекста в один набор узлов
- Передайте этот набор на следующий шаг расположения в качестве заданных контекстных узлов.
- Повторять пока не вышло. Набор, оставленный после последнего шага, является набором для всего пути.
Обратите внимание, что это все еще упрощение. Прочитайте XPath Standard , если хотите узнать подробности.