我是编程新手,目前正在尝试将NMAP XML解析为CSV。 当我打开CSV文件时,看到的行比应该的多。
任何人都可以告诉我以下代码的错误之处吗?
from libnmap.parser import NmapParser
import os
import csv
report = 'nmap_results.xml'
with open('nmap_results.csv', 'w') as output_file:
writer = csv.writer(output_file)
for filename in report:
nmap_report = NmapParser.parse_fromfile(report)
for host in nmap_report.hosts:
row = []
for hostname in host.hostnames:
row.append('{}'.format(hostname))
row.append('{}'.format(host.address))
for serv in host.services:
row.append(serv.port)
writer.writerow(row)
这是CSV格式以外的
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80,443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80,443
google.com,172.18.128.1,53,80,443
cnn.com,151.101.1.67,53
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80,443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80,443
google.com,172.18.128.1,53,80,443
cnn.com,151.101.1.67,53
yahoo.com,media-router-fp1.prod1.media.vip.gq1.yahoo.com,98.137.246.7,53,80,443
red.com,server-13-249-188-122.bos50.r.cloudfront.net,13.249.188.122,53,80,443
google.com,172.18.128.1,53,80,443
答案 0 :(得分:0)
如上所述。看起来您循环太多了。 report
是您的xml。每个文件名出现在nmap_results.xml
中多少次?因为您的第一个循环说
for filename in report
如果某个filename
之类的file_A.blah
在nmap_results.xml
中出现多于一次,那么您将对该报告名称多次运行NmapParser.parse_fromfile(report)
。
我假设nmap_report
是一个嵌套结构,例如JSON或其他XML
{hosts: [ {hostnames: [ftw, fml],
address : www.aol.com,
services : [ {port: 10 },
{port: 20 } ] },
{hostnames: [wtf, wow],
address : www.yahoo.com,
services : [ {port: 31 },
{port: 41 } ] },
{hostnames: [lol, log]
address : www.msn.com,
services : [ {port: 52 },
{port: 62 } ] },
{hostnames: [omg, okc],
address : www.url.com,
services : [ {port: 404 }
{port: 88 } ] },
] }
上面是我想象中的nmap_report
结构
-nmap_report.hosts
是一个包含4个项目的列表。因此for x in blah.hosts
是种有效的
-每个项目(称为host
)都是带有键hostnames
,address
,services
我冒充您可以使用“点”符号来调用Python字典。在任何情况下。结构起作用。因此,按您的循环,我们有:
for host in nmap_report.hosts:
row = []
for hostname in host.hostnames:
row.append('{}'.format(hostname))
row.append('{}'.format(host.address))
for serv in host.services:
row.append(serv.port)
writer.writerow(row)``` <--- by the way, this is a typo right? remove these '''
第1行[] --> [ftw, fml] --> [ftw, fml, www.aol.com] --> [ftw, fml, www.aol.com, 10, 20]
第2行[] --> [wtf, wow]
相同的模式
第3行[] --> [lol, log]
相同的模式
第4行[] --> [omg, okc]
相同的模式
您应该检查writer.writerow(row)
是否也添加了新行,再次检查是否已从该行中删除了这三个后退标记(`)。
根据我从您的结构推断出的示例,您重复的原因是for filename in report:
多次使用相同的文件名。
您来自report = 'nmap_results.xml'
的文件名不是唯一的。