选择文本节点,文本不等于某个值
我有一个文档,大致长这样:
<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']