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

Pra*_*nth 5 xml selenium xpath

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

我使用此链接从教程中尝试一些XPath:

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

  1. 这个表达

    //webengagedata//preceding-sibling::*
    
    Run Code Online (Sandbox Code Playgroud)

返回14结果

  1. 而这个表达方式

    //webengagedata/preceding-sibling::*
    
    Run Code Online (Sandbox Code Playgroud)

返回9结果

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

kjh*_*hes 9

/vs //一般

两者child(/)和descendant-or-self(//)是在XPath轴.

  • /是的缩写/child::node()/.

    使用/选择节点的直接子.

  • //是的缩写/descendant-or-self::node()/.

    用于//递归选择节点,子节点,孙子节点等.


/vs //preceding-sibling::*

您的具体问题询问//preceding-sibling::*和之间的区别/preceding-sibling::*.

由于您的数据非现场且复杂,我们应考虑使用现有且更简单​​的XML:

<r>
  <a/>
  <b>
    <c/>
    <d/>
  </b>
</r>
Run Code Online (Sandbox Code Playgroud)

对于这个XML,

  1. /r/preceding-sibling::*没有选择因为r没有兄弟姐妹.
  2. /r//preceding-sibling::*选择所有后代或自的前述同级元素节点r.也就是说,a,b,cd.(记住,/r//preceding-sibling::*是简称/descendant-or-self::node()/preceding-sibling::*,不是 /descendant-or-self::*/preceding-sibling::*)请注意,即使b并且d是前任兄弟没有元素,它们是文本节点的前任兄弟,因为上面的XML在b和之后有空格d.如果空白被拆除,然后只bd会被选中.
  3. /r/descendant::*/preceding-sibling::*选择所有后代的前述兄弟元素的元素r.那是,ac.需要注意的是b,并d没有选择,因为他们没有兄弟元素到任何后代前面元素r-前面的例子不同,文本节点没有资格.