所以我有一个看起来大致相同的文件
<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的一个加密节点的列表。所以一个元素有文字&#34; WPA + PSK&#34;,另一个用&#34; WEP&#34;,另一个用&#34; WPA + PSK&#34;,另一个用&#34;无&#34; 。如果它是WPA + PSK或其他东西,只要抓取一个加密节点,WPA就无关紧要。
有更多的节点,并且有多个无线网络,但使用的加密是我所关心的。我在Python中使用lxml
,我需要从每个SSID获得一个加密节点。我如何使用xpath()?
我尝试过很多不同的东西,但似乎都没有。 lxml一直说我的谓词无效。
由于
答案 0 :(得分: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']