Python 前一个兄弟的xpath
XMLPython 前一个兄弟的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标记,那么它应
<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]
确实选择了没有previousnodea
同级的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>