选择文本不等于值的文本节点

时间:2014-03-31 18:36:43

标签: python xml

所以我有一个看起来大致相同的文件

<detection-run>
<wireless-network>
    <SSID>
        <encryption>WPA+PSK</encryption>
        <encryption>WPA+TKIP</encryption>
        <encryption>WPA+AES-CCM</encryption>
    </SSID>
</wireless-network>
<wireless-network>
    <SSID>
        <encryption>WEP</encryption>
    </SSID>
</wireless-network>
<wireless-network>
    <SSID>
        <encryption>WPA+PSK</encryption>
        <encryption>WPA+TKIP</encryption>
    </SSID>
</wireless-network>
<wireless-network>
    <SSID>
        <encryption>None</encryption>
    </SSID>
</wireless-network>
</detection-run>

从这里我想要一个包含每个SSID的一个加密节点的列表。所以一个元素有文字&#34; WPA + PSK&#34;,另一个用&#34; WEP&#34;,另一个用&#34; WPA + PSK&#34;,另一个用&#34;无&#34; 。如果它是WPA + PSK或其他东西,只要抓取一个加密节点,WPA就无关紧要。

有更多的节点,并且有多个无线网络,但使用的加密是我所关心的。我在Python中使用lxml,我需要从每个SSID获得一个加密节点。我如何使用xpath()?

我尝试过很多不同的东西,但似乎都没有。 lxml一直说我的谓词无效。

由于

1 个答案:

答案 0 :(得分:1)

使用//encryption[text()!="WPA-PSK"]/text() xpath:

from lxml import etree

data = """
<detection-run>
    <wireless-network>
        <SSID>
            <encryption>WEP</encryption>
        </SSID>
    </wireless-network>
    <wireless-network>
        <SSID>
            <encryption>WPA-PSK</encryption>
        </SSID>
    </wireless-network>
    <wireless-network>
        <SSID>
            <encryption>WPA2-PSK</encryption>
        </SSID>
    </wireless-network>
</detection-run>
"""

root = etree.fromstring(data)
print root.xpath('//encryption[text()!="WPA-PSK"]/text()')

打印:

['WEP', 'WPA2-PSK']