选择文本节点,文本不等于某个值

2 投票
1 回答
667 浏览
提问于 2025-04-18 00:43

我有一个文档,大致长这样:

<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)里都有一个加密节点。比如说,一个节点的内容是"WPA+PSK",另一个是"WEP",再一个是"WPA+PSK",还有一个是"None"。对于WPA的那些节点,不管是"WPA+PSK"还是其他的,只要能抓到一个加密节点就行。

文档里还有很多其他节点,涉及多个无线网络,但我只关心使用的加密方式。我在用Python的lxml库,想从每个SSID里提取一个加密节点。我该怎么用xpath()来实现呢?

我试过很多不同的方法,但都不奏效。lxml总是提示我有无效的条件。

谢谢!

1 个回答

2

使用 //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']

撰写回答