Xpath只选择具有匹配属性的直接同级

2024-09-27 19:30:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下示例文档:

<root>
  <p class="b">A</p>
  <p class="b">B</p>
  <p class="a">C</p>
  <p class="a">D</p>
  <p class="b">E</p>
  <x>
    <p class="b">F</p>
  </x>
</root>

我正在寻找一个xpath表达式,它选择具有匹配类属性的给定节点的所有direct兄弟节点,而不是任何兄弟节点。在上面的例子中,应该选择前两个<p class="b">A-B;同样地,两个<p class="a">C-D,同样地,第五个单<p class="b">E,因为它没有直接的同级;同样,在<x>中的单<p class="b">F。注意,在这个上下文中,B和C不是直接的兄弟,因为它们有不同的类属性值!

我有的是:

xml.xpath("//p") # This selects all six <p> elements.
xml.xpath("//p[@class='b']") # This selects all four <p class="b"> elements.
xml.xpath("//p/following-sibling::p[@class='b']") # This selects all <p class="b"> sibling elements, even though not direct siblings.

最后一个表达式也选择了第五个兄弟姐妹,尽管中间有不匹配的兄弟姐妹。

如何仅选择具有相同class值的直接同级?

编辑以澄清:请注意最后两个选项是如何单独选择的,而不是同级选择!

编辑我保存了一个示例here。基于/root/p[1]的Xpath表达式应该选择A, B, C, D


Tags: 示例属性节点表达式rootxmlelementsall
2条回答

这样怎么样:

//p[@class='b']/following-sibling::p[following-sibling::p[@class='a'] and @class='b']

它返回以下所有同级的@class='b',并且它们自身也有以下同级的@class='a'。尽管它不适用于最后一个<p>,因为它没有以下同级。

为了得到下一个兄弟姐妹,你可以在旁边加上-1的意思。

following-sibling::*[1]

为了确保下一个同级是特定的节点类型,可以添加以下筛选器,其中p是我们要匹配的节点类型。

[self::p]

如果只需要具有相同属性的属性,则还需要在第一个p元素上指定该属性。

因此,如果只需要紧跟在b p类元素之后的b p类元素,可以执行以下操作。这只会给你第二个p元素。

//p[@class='b']/following-sibling::*[1][@class='b'][self:p]

听起来您可能真的需要任何与另一个类b元素相邻的类b元素。在这种情况下,您可以检查下面和前面的兄弟姐妹。下面将给出前两个p元素。

//p[@class='b'][following-sibling::*[1][@class='b'][self::p] 
                or preceding-sibling::*[1][@class='b'][self::p]]    

相关问题 更多 >

    热门问题