" //"之间的区别和" /"在XPath?

时间:2017-03-29 17:17:35

标签: xml selenium xpath

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

我使用this link来尝试一些XPath'来自教程:

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

  1. 此表达式

    //webengagedata//preceding-sibling::*
    
  2. 返回了14个结果

    1. 这个表达式

      //webengagedata/preceding-sibling::*
      
    2. 返回了9条结果

      " //"要匹配另外5个结果吗?

4 个答案:

答案 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,

  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::*)请注意,即使b和{{ 1}}是没有元素的前任兄弟,它们是文本节点的前任兄弟,因为上面的XML在db之后有空格。如果删除了空格,则只会选择db
  3. d选择/r/descendant::*/preceding-sibling::*的所有后代元素的前一个兄弟元素。即ra。请注意,cb未被选中,因为它们不在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//yx/descendant-or-self::node()/y的缩写。

就是这样。

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

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

答案 3 :(得分:0)

xpath中'/'和'//'之间的差异为,'/'用于标识该区域中的元素,'//'表示条件后的整个页面