我在XPath上尝试使用python-selenium。
我使用this link从教程中尝试一些XPath:
所以我尝试了XPath的这两个变体。
//webengagedata//preceding-sibling::*
返回14结果
//webengagedata/preceding-sibling::*
返回9结果
“//”与另外5个结果相匹配的是什么?
/
和//
一般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
和d
是没有元素的前任兄弟,但它们是文本节点的前任兄弟,因为上面的XML在b
和d
之后有空格。如果删除了空格,则只选择b
和d
。/r/descendant::*/preceding-sibling::*
选择r
所有后代元素的前一个兄弟元素。那就是a
和c
。请注意,未选择b
和d
,因为它们不会将兄弟元素放在r
的任何后代元素之前 - 与前面的示例不同,文本节点不符合条件。以你为榜样
//webengagedata/preceding-sibling::* ---> returned 9 results
因为只有9个标签是webengagedata
tags的精确兄弟,这就是为什么它显示9条记录
//webengagedata//preceding-sibling::* ---> returned 14 results
在这里它正在考虑儿童标签以及biziclop说x/descendant-or-self::node()/y
区别在于x//y
是x/descendant-or-self::node()/y
的简写。
就这样。
因此,当第一个查询选择<webengagedata>
的所有后代后面有另一个标记时,第二个查询只选择标记本身的前一个兄弟。
here解释了缩写xpath语法的规则。
'/'和'//'在xpath中的区别是,'/'用于标识该区域区域中的元素,'//'用于条件后的整个页面