Python 前一个兄弟的xpath

Python 前一个兄弟的xpath,python,xml,xpath,lxml,Python,Xml,Xpath,Lxml,XML <root> <p>nodea text 1</p> <p>nodea text 2</p> <nodea> </nodea> <p>nodeb text 1</p> <p>nodeb text 2</p> <nodeb> </nodeb> </root> 如果节点前面没有p标记,那么它应

XML

<root>
  <p>nodea text 1</p>
  <p>nodea text 2</p>
  <nodea>
  </nodea>
  <p>nodeb text 1</p>
  <p>nodeb text 2</p>
  <nodeb>
  </nodeb>
</root>
如果节点前面没有p标记,那么它应该返回空列表。例如,对于下面的xml,nodeb没有前面的同级p标记

<root>
  <p>nodea text 1</p> 
  <nodea>
  </nodea>
  <nodeb>
  </nodeb>
</root>

nodea文本1


如果有人能解释为什么我的xpath不工作,以及在编写xpath时我应该记住什么,那就太好了。

如果前面的同级元素是
p
元素,您可以选择
前面的同级元素::*[1][self::p]
来选择前面的同级元素


至于您的尝试,我认为如果您选择
nodeb
元素,那么您需要选择
前面的兄弟姐妹::p[前面的兄弟姐妹::nodea][1]
,因为您需要查看
nodeb
nodea
元素之间的兄弟姐妹
p
。您的条件
previous sibling::p[not(previous sibling::nodea)][1]
确实选择了没有previous
nodea
同级的
p
同级,它们是文档顺序中的前两个
p
元素。

其工作原理。您能解释一下我的xpath有什么问题吗。@MA1,我已经对您的尝试做了一些解释。
<p>nodeb text 1</p>
<p>nodeb text 2</p>
nodeb = xml.find('nodeb')
nodeb.xpath('preceding-sibling::p[not(preceding-sibling::nodea)][1]')
<root>
  <p>nodea text 1</p> 
  <nodea>
  </nodea>
  <nodeb>
  </nodeb>
</root>