如何从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)
代码说明
- 直接操作结构化对象:nvdlib返回的
cve_obj、conf、node、cpe_match都是带有属性的Python对象,通过.直接访问属性(如cpe_match.vulnerable),无需字符串解析,避免格式变化导致的错误。 - 精准过滤字段:只保留
vulnerable(是否受影响)和criteria(CPE条目)两个核心字段,自动排除不需要的matchCriteriaId。 - 可直接入库:最终得到的
clean_cpes是字典组成的列表,可直接通过数据库ORM(如SQLAlchemy)或转为JSON格式存入数据库。
内容的提问来源于stack exchange,提问作者Vilguax
相关产品推荐
相关产品推荐

