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

2024-06-16 12:12:55 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一份大致如下的文件

<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一直说我有一个无效的谓词。在

谢谢


Tags: runnone元素列表节点networklxmlwpa
1条回答
网友
1楼 · 发布于 2024-06-16 12:12:55

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

印刷品:

^{pr2}$

相关问题 更多 >