requests - python xpath中文



Xpath仅选择具有匹配属性的直接兄弟 (2)

使用following而不是following-sibling

//p/following::p[@class='b']

我有以下示例文件:

<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表达式,它选择给定节点的所有直接兄弟与匹配的类属性,而不是任何兄弟。 在上例中,应该选择前两个<p class="b"> AB; 同样是两个<p class="a"> CD,同样也是第五个单独的<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值的直接兄弟姐妹?

编辑澄清:请注意最后两个是如何个别选择,而不是兄弟姐妹!

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


Answer #1

为了得到下一个兄弟姐妹,你可以在右边加上1的位置。

following-sibling::*[1]

要确保下一个兄弟节点是特定的节点类型,可以添加以下过滤器,其中p是我们要匹配的节点类型。

[self::p]

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

所以,如果你只是想要紧跟在bp类元素之后的class元素,你可以做下面的事情。 这只会给你第二个p元素。

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

这听起来像你可能实际上想要任何类b元素是相邻的另一个类b元素。 在这种情况下,你可以检查以下和前面的兄弟姐妹。 以下将给你第一个2 p元素。

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