You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解析Nmap XML扫描文件提取MAC地址时索引越界报错如何解决

问题原因

原有代码通过固定下标[1]取MAC地址,依赖「每个host节点下第二个address固定为MAC类型」的假设,当某个host只有1个address(仅IP无MAC)时就会触发索引越界。

优化方案

不要用固定索引,遍历当前host下的所有address节点,主动筛选addrtype="mac"的节点即可,不存在就直接跳过,优化后代码如下:

# Compare 2 Scans
from xml.dom import minidom

def get_mac_list(xml_path):
    xmldoc = minidom.parse(xml_path)
    hosts = xmldoc.getElementsByTagName('host')
    mac_list = []
    for host in hosts:
        addresses = host.getElementsByTagName("address")
        for addr in addresses:
            # 筛选addrtype为mac的节点
            if addr.attributes["addrtype"].value == "mac":
                mac_val = addr.attributes["addr"].value
                mac_list.append(mac_val)
                break # 一个host只有一个MAC,找到就跳出循环
    return mac_list

# 测试读取第一个文件
macs1 = get_mac_list("file.xml")
for mac in macs1:
    print(mac)

如果需要实现两份扫描结果对比的需求,可以追加以下代码:

# 读取第二份扫描结果,替换为你的第二个XML文件路径
macs2 = get_mac_list("file2.xml")

# 转成集合方便集合运算
set1 = set(macs1)
set2 = set(macs2)

# 找出仅在单次扫描中出现的MAC
only_first = set1 - set2
only_second = set2 - set1

print("仅第一次扫描出现的MAC:", only_first)
print("仅第二次扫描出现的MAC:", only_second)

该优化方案不依赖address节点的输出顺序,也会自动跳过无MAC的host,不会再触发索引越界报错。

内容的提问来源于stack exchange,提问作者naseweis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:42:01