所以我有一个大致如下所示的文档
<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/