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

关于使用单循环处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:08:34