关于使用单循环处理NVD CVE数据的Python代码技术咨询
从NVD CVE JSON数据提取信息的Python代码分析与优化建议
我帮你梳理下这段处理NVD CVE数据的Python代码,顺便聊聊可能遇到的问题和优化方向:
首先先贴出你的原始代码:
import json with open('nvdcve-1.0-2018.json') as f: CVE = json.loads(f.read()) for x in CVE["CVE_Items"]: if x["cve"]["affects"]["vendor"]["vendor_data"]: # 检查数据是否存在 description = x["cve"]["description"]["description_data"][0]["value"] cve = x["cve"]["CVE_data_meta"]["ID"] vendor = x["cve"]["affects"]["vendor"]["vendor_data"][0]["vendor_name"] product = x["cve"]["affects"]["vendor"]["vendor_data"][0]["product"]["product_data"][0]["product_name"]
现存的潜在问题
- 索引越界风险:你只检查了
vendor_data是否非空,但像description_data、product_data这些数组也可能为空,直接用[0]访问会触发IndexError,导致程序崩溃。 - KeyError隐患:如果JSON结构里某个字段缺失(比如部分CVE没有
description字段),直接通过键名访问会抛出KeyError,代码容错性不足。 - 信息遗漏:部分CVE可能关联多个厂商或多个产品,当前代码只取第一个元素,会丢失其他关联的厂商/产品信息。
- 可读性差:嵌套层级太深,代码看起来很臃肿,后期维护起来不方便。
优化后的代码示例
可以用字典的get()方法来避免KeyError,同时增加空值检查,还能遍历所有厂商和产品:
import json with open('nvdcve-1.0-2018.json') as f: cve_data = json.load(f) # 直接用json.load更简洁,不需要先read再loads for item in cve_data.get("CVE_Items", []): cve_meta = item.get("cve", {}) # 提取CVE ID cve_id = cve_meta.get("CVE_data_meta", {}).get("ID", "Unknown CVE ID") # 提取描述信息 description_list = cve_meta.get("description", {}).get("description_data", []) description = description_list[0].get("value", "No description available") if description_list else "No description available" # 遍历所有厂商和对应的产品 vendor_list = cve_meta.get("affects", {}).get("vendor", {}).get("vendor_data", []) for vendor in vendor_list: vendor_name = vendor.get("vendor_name", "Unknown Vendor") product_list = vendor.get("product", {}).get("product_data", []) for product in product_list: product_name = product.get("product_name", "Unknown Product") # 这里可以做你需要的后续处理,比如打印、存储等 print(f"CVE: {cve_id}, Vendor: {vendor_name}, Product: {product_name}, Description: {description[:50]}...")
优化点说明
- 使用
json.load()替代json.loads(f.read()),更简洁高效。 - 用
get()方法逐层访问字段,同时设置默认值,避免KeyError。 - 增加对
description_data、product_data的空值检查,防止索引越界。 - 遍历所有厂商和产品,不会遗漏关联信息。
- 拆分嵌套层级,代码结构更清晰,可读性更强。
内容的提问来源于stack exchange,提问作者cyborked
相关产品推荐
相关产品推荐

