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

如何从Python Nvdlib返回结果中提取CPE条目并整理为可入库格式?

从NVD提取CPE条目并整理入库的解决方案

问题场景

使用Python的nvdlib库从NIST提取CVE-2019-19781的信息时,重点关注其中的CPE条目。现有代码将输出转为字符串后清理无用元素,但无法精准处理动态变化的matchCriteriaId,需要将所有CPE条目整理为列表或字典格式以便存入数据库。

现有代码:

import nvdlib
r = nvdlib.searchCVE(cveId='CVE-2019-19781')[0]

conf = r.configurations #list in ouput

for x in conf:
     txt = ', '.join(str(x) for x in x.nodes) #transforme list to string
     print(x)

解决方案

不要将结构化对象转为字符串处理,直接遍历nvdlib返回的Python对象属性,精准提取所需字段:

优化代码

import nvdlib

def extract_cpes(cve_obj):
    cpe_list = []
    # 遍历每个配置项
    for conf in cve_obj.configurations:
        # 遍历配置内的所有节点
        for node in conf.nodes:
            # 检查节点是否包含CPE匹配规则
            if hasattr(node, 'cpeMatch'):
                for cpe_match in node.cpeMatch:
                    # 提取需要的字段,自动忽略matchCriteriaId
                    cpe_entry = {
                        'vulnerable': cpe_match.vulnerable,
                        'criteria': cpe_match.criteria
                    }
                    cpe_list.append(cpe_entry)
    return cpe_list

# 获取目标CVE对象
target_cve = nvdlib.searchCVE(cveId='CVE-2019-19781')[0]
# 提取所有CPE条目
clean_cpes = extract_cpes(target_cve)

# 输出整理后的结果
for item in clean_cpes:
    print(item)

代码说明

  1. 直接操作结构化对象:nvdlib返回的cve_obj、conf、node、cpe_match都是带有属性的Python对象,通过.直接访问属性(如cpe_match.vulnerable),无需字符串解析,避免格式变化导致的错误。
  2. 精准过滤字段:只保留vulnerable(是否受影响)和criteria(CPE条目)两个核心字段,自动排除不需要的matchCriteriaId。
  3. 可直接入库:最终得到的clean_cpes是字典组成的列表,可直接通过数据库ORM(如SQLAlchemy)或转为JSON格式存入数据库。

内容的提问来源于stack exchange,提问作者Vilguax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:25:18