2017-04-21 16 views
1

ルートノードを含めて属性xを持つすべての要素を取得したいと考えています。私が現在持っているのは、ルートノードが含まれていないことを除いて動作するということです。プリントアウトからわかるように、B要素とCa要素を選択します。しかし、出力にはAも含まれなければならない。すなわち、[要素A、要素B、要素Ca]である。ルートノードを取得するにはどうしたらいいですか?XPATH pythonの特定の属性を持つルートとすべての子孫要素を選択する

from lxml import etree as ET 
expr=''' 
<A x="1"> 
    <B z="1"> 
     <C y="1"/> 
    </B> 
    <B x="1"> 
     <Ca x="1" y="2"/> 
    </B> 
</A> 

''' 
expr_root=ET.fromstring(expr) 
print(expr_root.findall(".//*[@x]")) #[<Element B at 0xd0118c8>, <Element Ca at 0xd011b48>] 

答えて

1

あなたはdescendant-or-self使用することができます。

expr_root.xpath(".//descendant-or-self::*[@x]") 

デモ:

In [1]: from lxml import etree as ET 

In [2]: expr = ''' 
    ...: <A x="1"> 
    ...:  <B z="1"> 
    ...:   <C y="1"/> 
    ...:  </B> 
    ...:  <B x="1"> 
    ...:   <Ca x="1" y="2"/> 
    ...:  </B> 
    ...: </A> 
    ...: ''' 

In [3]: expr_root = ET.fromstring(expr) 

In [4]: print(expr_root.xpath(".//descendant-or-self::*[@x]")) 
[<Element A at 0x1045675c8>, <Element B at 0x105de1688>, <Element Ca at 0x105de0548>] 
0

あなたは "// [@A]"、それは、Aを属性を持つすべての要素を選択します試すことができます あなたのケースでは「// [@x]」です。

希望すると助かります。

+0

これは動作しません。 SyntaxError:要素に絶対パスを使用できません – user2015487

関連する問題