我有以下xml:
<test1>
<test2>
<text>This is a question on xpath
</text>
</test2>
<test3>
<test2>
<text>Do not extract this
</text>
</test2>
</test3>
</test1>
我需要在test2/text
中提取文字,但如果test2
进入test3
,则不需要。{}怎么能在xpath中完成?我尝试使用findall
之类的东西:
for p in lxml_tree.xpath('.//test2',namespaces={'w':w}):
for q in p.iterancestors():
if q.tag=="test3":
break
else:
text+= ''.join(t.text for t in p.xpath('.//text'))
但这不起作用。我猜xpath在单个表达式中有更好的方法来排除它。
预期产出:
text = "This is a question on xpath"
答案 0 :(得分:3)
假设comes inside
表示任何级别的父级,您可以使用not
和ancestor
axis来检查节点是否没有特定的父级/祖先:
//test2[not(ancestor::test3)]/text
但是,如果您认为immediate parent
不应该是test3
,那么请切换ancestor
parent
:
//test2[not(parent::test3)]/text