python - 用python解析nmap xml报告

标签 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)有效,而其他路径(主机名)失败。联系他们的正确电话应该是什么?

最佳答案

我认为问题是 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/

相关文章:

python - 在 Ubuntu 上安装 Python Nmap 的问题

python - 全局变量和函数...以及 Kivy (Python 2.7.10) (Kivy 1.9.1)

java - 逐记录比较两个非常大的 XML 文件的最佳方法

nmap 服务文件上的正则表达式

android - 安卓:elevation tag raises issue in android layout file

ruby-on-rails - 通过 JSON/XML 将二进制数据发送到 (Rails) RESTful 端点?

python - nmap 和 print(nm.csv()) 需要帮助打印到 csv.file

java - GCS断点续传速度

Python:使用 def 和 for 循环导出列表中一系列值的多个数组

python - Python 中具有 2 个列表的 ListAccess(list) 类