Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Xpath仅选择具有匹配属性的直接同级_Python_Xpath - Fatal编程技术网

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

Python Xpath仅选择具有匹配属性的直接同级,python,xpath,Python,Xpath,我有以下示例文档: <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> &l

我有以下示例文档:

<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>

A

b

C

D

E

F

我正在寻找一个xpath表达式,它选择具有匹配类属性的给定节点的所有直接同级,而不是任何同级。在上述示例中,应选择前两个

A-b;同样地,两个

C-D,同样地,第五个

E,因为它没有直接的兄弟;同样,在
内部的单个

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.
xml.xpath(“//p”)#这将选择所有六个元素。
xpath(“//p[@class='b']”)这将选择所有四个

元素。 xpath(“//p/following sibling::p[@class='b']”)这将选择所有

同级元素,即使不是直接同级。

最后一个表达式也选择第五个同级,尽管中间有不匹配的同级

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

编辑以澄清:注意后两个选项是如何单独选择的,而不是兄弟姐妹


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

来获得下一个同级,您可以在旁边添加位置-1的含义

following-sibling::*[1]
为了确保下一个同级节点属于特定的节点类型,您可以添加以下筛选器,其中p是我们要匹配的节点类型

[self::p]
如果只需要具有相同属性的元素,还需要在第一个p元素上指定属性

//p[@class='b']/following-sibling::*[1][@class='b'][self: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]]    

像这样的怎么样:

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

它返回以下所有同级
@class='b'
,并且它们自身具有以下同级
@class='a'
。虽然它不适用于最后一个
,因为它没有以下兄弟姐妹。

几乎在那里,是的:)现在我可以将紧接着的后面/前面扩展到任何数字,即

的任何直接直接的兄弟姐妹吗?你能举个例子吗?你的意思是如果一行中有三个,那么所有三个都应该被选中吗?这应该已经做到了。是的,如果一行中有N个
元素,我希望选择所有N个元素。但是,它们都必须是
,也不能只是
class=“b”
中的任何一个。我刚刚添加了一个链接到一个示例,您可以在其中玩,请参见上面问题的第二次编辑。我更新了答案,以检查相邻兄弟姐妹是否属于特定类型。例如

将不会返回任何内容(因为第二个类b不是同一类型)。但是,我不确定为什么您的新示例只返回A/B/C/D。G/H/I和K/L也是类为B的相邻p元素的组(只是不同的组)。你是说你只想要第一组吗?对,这就是我对直接同级的意思,你称之为组:-)D和G不是直接同级,因为有其他同级(两个

元素)将它们分开,即它们属于不同的组。