我正在尝试从以下 XML 文件中提取一些元素(修剪 nmap
输出):
<?xml version="1.0"?>
<nmaprun>
<host starttime="1381245200" endtime="1381245316">
<address addr="192.168.1.5" addrtype="ipv4"/>
<hostnames>
<hostname name="host1.example.com" type="PTR"/>
</hostnames>
<os>
<osmatch>
<osclass type="general purpose" vendor="Linux" osfamily="Linux" osgen="2.6.X" accuracy="100">
<cpe>cpe:/o:linux:linux_kernel:2.6</cpe>
</osclass>
</osmatch>
</os>
</host>
</nmaprun>
使用以下代码:
import xml.etree.ElementTree as ET
d = [
{'path': 'address', 'el': 'addr'},
{'path': 'hostnames/hostname', 'el': 'name'},
{'path': 'os/osmatch/osclass', 'el': 'osfamily'}
]
tree = ET.parse('testnmap.xml')
root = tree.getroot()
for i in root.iter('host'):
for h in d:
if i.find(h['path']): print i.find(h['path']).get(h['el'])
else: print "UNKNOWN ", (h['path'])
这个想法是提取 IP、主机名和操作系统。输出给了我
UNKNOWN address
UNKNOWN hostnames/hostname
Linux
因此,最里面的路径(osfamily)有效,而其他路径(主机名)失败。联系他们的正确电话应该是什么?
最佳答案
我认为问题是 i.find(h['path'])
的 bool 比较。它检查该元素是否有子元素,并且只发生在 <osclass>
中。 。您必须检查它是否为空,与 None
进行比较,例如:
...
e = i.find(h['path'])
if e is not None: print(e.get(h['el']))
...
它产生:
192.168.1.5
host1.example.com
Linux
关于python - 用python解析nmap xml报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19290868/