首页 > 解决方案 > XPath 在特定标签的任意嵌套链中选择节点

问题描述

在这样的示例中:

<body>

  <p id="0"/>

  <div>
    <p id="1"/>
  </div>

  <div>
    <div>
      <div>
        <p id="2"/>
      </div>
    </div>
  </div>

  <blockquote>
    <p id="3"/>
  </blockquote>

  <div>
    <blockquote>
      <div>
        <p id="4"/>
      </div>
    </blockquote>
  </div>

</body>

我想选择所有<p>元素的直接子元素<body>或仅包含在元素链中,仅此<div>而已。也就是说,我想选择 ids 0、1 和 2,而不是 3 或 4。在正则表达式中,这类似于<body>(<div>)*<p>. 但是这可以用 XPath 完成吗?的一些简写body/p | body/div/p | body/div/div/p | body/div/div/div/p | ...

ETA:请注意,id为方便起见,此示例中仅存在属性,在我的实际应用程序中没有ids。

此外,最终我在一个可以使用任意节点作为参考(而不仅仅是<body>)的表达式之后,即如何选择作为参考节点的后代的节点,但它们之间的任何中间级别在哪里,仅此<div>而已. 另一种说法是,我想要其祖先都是<div>特定参考节点(不仅仅是标签名称,而是特定节点)的全部或祖先或自我的节点。

当我说“参考节点”时,我的意思是要使用的东西,例如 Pythonlxml包:

reference_node.xpath( problem_expression )

标签: xpath

解决方案


我想到的是:

//p[count(ancestor::div)=count(ancestor::*[ancestor::body])]

输出:id=0,id=1,id=2


推荐阅读