使用python解析nmap xml报告

时间:2013-10-10 08:34:59

标签: python xml nmap

我正在尝试从以下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),而其他路径(主机名)失败。什么应该是适当的电话来接触他们?

1 个答案:

答案 0 :(得分:1)

我认为问题是i.find(h['path'])的布尔比较。它检查该元素是否具有子元素,并且仅在<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