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

标签 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 的一个加密节点的列表。因此,一个元素带有文本“WPA+PSK”,另一个元素带有“WEP”,另一个元素带有“WPA+PSK”,另一个元素带有“None”。 WPA上是WPA+PSK还是别的都没关系,只要抢到一个加密节点就可以了。

有更多的节点和多个无线网络,但使用的加密是我关心的。我在 Python 中使用 lxml,我需要从每个 SSID 获取一个加密节点。我该如何使用 xpath() 来做到这一点?

我尝试了很多不同的方法,但似乎都不起作用。 lxml 一直说我有一个无效的谓词。

谢谢

最佳答案

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

关于python - 选择文本不等于值的文本节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22769503/

相关文章:

python - 如何使用 Rauth python 库刷新 token ?

python - 在 PyCharm 中使用 Docker Image 作为 Python 解释器

javascript - 如何从数据库中解析json格式的数据

c# - 将类转换为 xml 的最佳方法是什么,反之亦然

c# - C#.NET 中的 Microsoft.XMLHTTP

python - 用于匹配 mRNA 序列的正则表达式

python - 请解释 *elements,=iterable 结构

xml - Xpath获取所有元素至少有一个属性

xml - xpath where 子句

java - 安卓 : Loading data from XML to SQLite take very long time