XPATH在python

时间:2017-04-21 09:29:22

标签: python xpath

我想抓取其中包含属性x的所有元素,包括根节点。我目前拥有的是它可以工作,除了它不包括根节点。从打印输出中可以看出,它选择了B和Ca元素。但是,输出也应包括A,即[元素A,元素B,元素Ca]。我怎样才能让它抓住根节点?

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

2 个答案:

答案 0 :(得分: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>]

答案 1 :(得分:0)

您可以尝试“// [@ A]”,它会选择所有具有属性A的元素。 在你的情况下“// [@ x]”。

希望它会有所帮助。