AttributeError: 'NoneType' object has no attribute 'text' parsing XML files
AttributeError: 'NoneType' object has no attribute 'text' parsing XML files
我正在使用一个程序来解析来自 OpenVAS(其他人的代码)的 xml 个文件,我得到了 AttributeError: 'NoneType' object has no attribute 'text'
。这是意料之中的,因为某些扫描的“主机名”字段可能为空。理想情况下,如果它是空白的,它应该只将 N/A 作为主机名。
错误:
File "/var/lib/openvasreporting/openvasreporting/libs/parser.py", line 115, in openvas_parser
vuln_host_name = vuln.find("./host/hostname").text
AttributeError: 'NoneType' object has no attribute 'text'
以下是 parser.py
文件中的相应行:
# --------------------
#
# VULN_HOST
vuln_host = vuln.find("./host").text
vuln_host_name = vuln.find("./host/hostname").text
if vuln_host_name is None:
vuln_host_name = "N/A"
logging.debug("* hostname:\t{}".format(vuln_host_name)) # DEBUG
vuln_port = vuln.find("./port").text
logging.debug(
"* vuln_host:\t{} port:\t{}".format(vuln_host, vuln_port)) # DEBUG
# --------------------
附带说明一下,这是 parser.py
文件的其他 2 个部分中的错误。这是已解决部分的样子:
# --------------------
#
# VULN_CVES
#vuln_cves = nvt_tmp.findall("./refs/ref")
vuln_cves = []
ref_list = []
for reference in nvt_tmp.findall('./refs/ref'):
if reference.attrib.get('type') == 'cve':
vuln_cves.append(reference.attrib.get('id'))
else:
ref_list.append(reference.attrib.get('id'))
logging.debug("* vuln_cves:\t{}".format(vuln_cves)) # DEBUG
logging.debug("* vuln_cves:\t{}".format(Et.tostring(vuln_cves).decode())) # DEBUG
if vuln_cves is None or vuln_cves.text.lower() == "nocve":
vuln_cves = []
else:
vuln_cves = [vuln_cves.text.lower()]
vuln_references = ' , '.join(ref_list)
logging.debug("* vuln_cves:\t{}".format(vuln_cves)) # DEBUG
logging.debug("* vuln_references:\t{}".format(vuln_references))
# --------------------
#
# VULN_REFERENCES
vuln_references = nvt_tmp.find("./xref")
if vuln_references is None or vuln_references.text.lower() == "noxref":
vuln_references = []
else:
vuln_references = vuln_references.text.lower().replace("url:", "\n")
logging.debug("* vuln_references:\t{}".format(vuln_references)) # DEBUG
#
# --------------------
我尝试用 else: pass
添加它,但我得到了相同的结果。
我不是真正的程序员,所以如果没有包含所有相关信息,我深表歉意。
替换:
vuln_host = vuln.find("./host").text
与:
if vuln.find("./host") > -1:
vuln_host = vuln.find("./host").text
else:
vuln_host = "N/A"
发生这种情况是因为您正在调用 find()
,然后立即访问 .text
属性,而没有检查 find()
是否真的找到了任何东西。
改为这样做:
element = vuln.find("./host/hostname")
if element:
vuln_host_name = element.text
else:
vuln_host_name = "N/A"
我正在使用一个程序来解析来自 OpenVAS(其他人的代码)的 xml 个文件,我得到了 AttributeError: 'NoneType' object has no attribute 'text'
。这是意料之中的,因为某些扫描的“主机名”字段可能为空。理想情况下,如果它是空白的,它应该只将 N/A 作为主机名。
错误:
File "/var/lib/openvasreporting/openvasreporting/libs/parser.py", line 115, in openvas_parser
vuln_host_name = vuln.find("./host/hostname").text
AttributeError: 'NoneType' object has no attribute 'text'
以下是 parser.py
文件中的相应行:
# --------------------
#
# VULN_HOST
vuln_host = vuln.find("./host").text
vuln_host_name = vuln.find("./host/hostname").text
if vuln_host_name is None:
vuln_host_name = "N/A"
logging.debug("* hostname:\t{}".format(vuln_host_name)) # DEBUG
vuln_port = vuln.find("./port").text
logging.debug(
"* vuln_host:\t{} port:\t{}".format(vuln_host, vuln_port)) # DEBUG
# --------------------
附带说明一下,这是 parser.py
文件的其他 2 个部分中的错误。这是已解决部分的样子:
# --------------------
#
# VULN_CVES
#vuln_cves = nvt_tmp.findall("./refs/ref")
vuln_cves = []
ref_list = []
for reference in nvt_tmp.findall('./refs/ref'):
if reference.attrib.get('type') == 'cve':
vuln_cves.append(reference.attrib.get('id'))
else:
ref_list.append(reference.attrib.get('id'))
logging.debug("* vuln_cves:\t{}".format(vuln_cves)) # DEBUG
logging.debug("* vuln_cves:\t{}".format(Et.tostring(vuln_cves).decode())) # DEBUG
if vuln_cves is None or vuln_cves.text.lower() == "nocve":
vuln_cves = []
else:
vuln_cves = [vuln_cves.text.lower()]
vuln_references = ' , '.join(ref_list)
logging.debug("* vuln_cves:\t{}".format(vuln_cves)) # DEBUG
logging.debug("* vuln_references:\t{}".format(vuln_references))
# --------------------
#
# VULN_REFERENCES
vuln_references = nvt_tmp.find("./xref")
if vuln_references is None or vuln_references.text.lower() == "noxref":
vuln_references = []
else:
vuln_references = vuln_references.text.lower().replace("url:", "\n")
logging.debug("* vuln_references:\t{}".format(vuln_references)) # DEBUG
#
# --------------------
我尝试用 else: pass
添加它,但我得到了相同的结果。
我不是真正的程序员,所以如果没有包含所有相关信息,我深表歉意。
替换:
vuln_host = vuln.find("./host").text
与:
if vuln.find("./host") > -1:
vuln_host = vuln.find("./host").text
else:
vuln_host = "N/A"
发生这种情况是因为您正在调用 find()
,然后立即访问 .text
属性,而没有检查 find()
是否真的找到了任何东西。
改为这样做:
element = vuln.find("./host/hostname")
if element:
vuln_host_name = element.text
else:
vuln_host_name = "N/A"