用NetworkX从GML文件提取super_technique节点label遇KeyError的解决方法
解决KeyError: 'label'并提取super_technique节点的label
问题原因
NetworkX读取GML文件时,可能存在属性解析异常(即使示例中所有节点都包含label),直接通过data['label']硬访问键会触发KeyError。同时直接访问data['types']也存在同样风险,需先确认属性存在性。
修正后的代码
import networkx as nx # 加载GML文件 tree = nx.read_gml('Tactic_Technique_Reference_Example.gml') technique_dict = {} for node, data in tree.nodes(data=True): # 安全检查types属性是否为目标值 if data.get('types') == "super_technique": # 避免键不存在报错,同时过滤无效数据 label = data.get('label') node_id = data.get('id') if label and node_id: technique_dict[label] = node_id print(label) # 直接打印提取到的label # 输出最终结果 print("\n提取到的super_technique节点信息:") for label, node_id in technique_dict.items(): print(f"Label: {label}, ID: {node_id}")
关键修改点
- 用
dict.get()替代直接键访问:data.get('types')、data.get('label'),属性不存在时返回None,不会触发KeyError。 - 增加有效性判断:确保
label和id都存在时才存入字典,避免无效数据混入。 - 调整打印逻辑:原代码打印的是节点ID,改成打印label更贴合提取需求。
测试结果
用你提供的GML文件运行代码,会输出:
T1592 提取到的super_technique节点信息: Label: T1592, ID: 17
内容的提问来源于stack exchange,提问作者Hoang Cuong Nguyen
相关产品推荐
相关产品推荐

