我在XPath上尝试使用python-selenium。
我使用this link来尝试一些XPath'来自教程:
所以我尝试了XPath的这两个变种'。
此表达式
//webengagedata//preceding-sibling::*
返回了14个结果
这个表达式
//webengagedata/preceding-sibling::*
返回了9条结果
" //"要匹配另外5个结果吗?
答案 0 :(得分:6)
/
vs //
child
(/
)和descendant-or-self
(//
)都是 axes in XPath 。
/
是/child::node()/
的缩写。
使用/
选择节点的直接儿童。
//
是/descendant-or-self::node()/
的缩写。
使用//
进行选择
节点,它的子节点,它的孙子节点等等
递归。
/
vs //
preceding-sibling::*
您的具体问题询问//preceding-sibling::*
和/preceding-sibling::*
之间的区别。
由于您的数据非现场且复杂,我们应考虑使用现有且更简单的XML:
<r>
<a/>
<b>
<c/>
<d/>
</b>
</r>
对于此XML,
/r/preceding-sibling::*
选择任何内容,因为r
没有
前兄弟姐妹。/r//preceding-sibling::*
选择前面的兄弟元素
r
的所有后代或自节点。即a
,b
,c
和d
。
(请记住,/r//preceding-sibling::*
是/descendant-or-self::node()/preceding-sibling::*
的缩写, 不是 /descendant-or-self::*/preceding-sibling::*
)请注意,即使b
和{{ 1}}是没有元素的前任兄弟,它们是文本节点的前任兄弟,因为上面的XML在d
和b
之后有空格。如果删除了空格,则只会选择d
和b
。d
选择/r/descendant::*/preceding-sibling::*
的所有后代元素的前一个兄弟元素。即r
和a
。请注意,c
和b
未被选中,因为它们不在d
的任何后代元素之前的兄弟元素之前 - 与前面的示例不同,文本节点不符合条件。答案 1 :(得分:1)
为您的例子
//webengagedata/preceding-sibling::* ---> returned 9 results
因为只有9个标签是webengagedata
标签的精确兄弟,这就是它显示9条记录的原因
//webengagedata//preceding-sibling::* ---> returned 14 results
这里考虑的是儿童标签以及biziclop x/descendant-or-self::node()/y
答案 2 :(得分:0)
区别在于x//y
是x/descendant-or-self::node()/y
的缩写。
就是这样。
因此,当第一个查询选择后面有另一个标记的<webengagedata>
的所有后代时,第二个查询只选择标记本身的前一个兄弟。
here解释了缩写xpath语法的规则。
答案 3 :(得分:0)
xpath中'/'和'//'之间的差异为,'/'用于标识该区域中的元素,'//'表示条件后的整个页面