【问题标题】:Selecting text nodes with text not equal to a value选择文本不等于值的文本节点
【发布时间】:2014-03-31 18:36: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+PSK什么的都无所谓,只要抓到一个加密节点即可。

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

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

谢谢

【问题讨论】:

    标签: python xml


    【解决方案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']
    

    【讨论】:

    • 感谢工作!我也尝试使用 findall() 而不是 xpath() 我认为这会导致一些问题
    • 我还注意到 XML 中的一些 SSID 节点有多个加密节点。我真的想计算使用 WPA 与 WEP 与什么都没有的数字。如果网络使用 WPA,那么它可能有多个加密节点,而对于其他类型,它只有一个。我怎样才能从每个 SSID 中只获取一个加密节点并检查其文本以了解加密类型?
    • @thaweatherman 您能否编辑问题并显示具有多个加密节点的示例输入和所需的输出?将有助于更快地帮助您:)
    • @thaweatherman 如果您只需要一个Encryption 网络节点,请尝试//SSID/encryption[1]/text()。适合你吗?
    • 在我的示例 XML 中总共有 5856 个网络,该谓词给出的长度为 6212。虽然这是一个改进
    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2015-10-28
    相关资源
    最近更新 更多