2014-12-13 50 views
2

我有以下XML:沒有條件在XPath

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

回答

3

通過comes inside假設你是父母的任何級別,就可以使用notancestor axis檢查,看節點是否不具有特定的父/祖先:

//test2[not(ancestor::test3)]/text 

然而,如果你的意思immediate parent不應該test3,然後切換ancestorparent

//test2[not(parent::test3)]/text 
+0

很好,工作!這可以在findall中使用嗎? – 2014-12-13 09:31:47

+0

我不是pythonista,但結果是一個'nodeset',而lxml似乎是一個健壯的庫,所以我可以想象這可以在lxml_tree.xpath('.// test2 [not(ancestor: :TEST3)] /文本')' – StuartLC 2014-12-13 09:34:27