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
相关产品推荐
相关产品推荐

