XPath中“//”和“/”之间的区别?

问题描述 投票:3回答:4

我在XPath上尝试使用python-selenium。

我使用this link从教程中尝试一些XPath:

所以我尝试了XPath的这两个变体。

  1. 这个表达 //webengagedata//preceding-sibling::*

返回14结果

  1. 而这个表达方式 //webengagedata/preceding-sibling::*

返回9结果

“//”与另外5个结果相匹配的是什么?

xml selenium xpath
4个回答
6
投票

///一般

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,

  1. /r/preceding-sibling::*没有选择任何东西,因为r没有先前的兄弟姐妹。
  2. /r//preceding-sibling::*选择r的所有后代或自身节点的前一个兄弟元素。也就是说,abcd。 (请记住,/r//preceding-sibling::*/descendant-or-self::node()/preceding-sibling::*的缩写,而不是/descendant-or-self::*/preceding-sibling::*)请注意,尽管bd是没有元素的前任兄弟,但它们是文本节点的前任兄弟,因为上面的XML在bd之后有空格。如果删除了空格,则只选择bd
  3. /r/descendant::*/preceding-sibling::*选择r所有后代元素的前一个兄弟元素。那就是ac。请注意,未选择bd,因为它们不会将兄弟元素放在r的任何后代元素之前 - 与前面的示例不同,文本节点不符合条件。

1
投票

以你为榜样

//webengagedata/preceding-sibling::* ---> returned 9 results

因为只有9个标签是webengagedatatags的精确兄弟,这就是为什么它显示9条记录

//webengagedata//preceding-sibling::* ---> returned 14 results

在这里它正在考虑儿童标签以及biziclop说x/descendant-or-self::node()/y


0
投票

区别在于x//yx/descendant-or-self::node()/y的简写。

就这样。

因此,当第一个查询选择<webengagedata>的所有后代后面有另一个标记时,第二个查询只选择标记本身的前一个兄弟。

here解释了缩写xpath语法的规则。


0
投票

'/'和'//'在xpath中的区别是,'/'用于标识该区域区域中的元素,'//'用于条件后的整个页面

© www.soinside.com 2019 - 2024. All rights reserved.