如何筛选WAVE API结果数据导出CSV并处理缺失值报错
解决WAVE API数据提取的KeyError与AttributeError问题
问题背景
批量评估大学网站Web可访问性时,通过Python调用WAVE API获取数据并导出CSV,提取特定字段(如alt_null)时频繁触发KeyError;尝试用.get()方法修复时,又因错误调用位置触发AttributeError: 'int' object has no attribute 'get'。需求是:当评估结果缺失指定字段时,CSV中填充null且代码不抛出异常。
错误原因
- KeyError:部分URL的WAVE评估结果中不存在
alt_null这类细分项,直接通过字典索引(result_data['categories']['feature']['items']['alt_null']['count'])会因键不存在报错。 - AttributeError:错误地在整数类型的
count值上调用.get()方法,整数对象本身没有该方法。 - 无效的检查逻辑:原代码中
if key in result_data仅检查顶级键,而目标字段均嵌套在多层字典中,导致判断完全失效。
修正后的完整代码
import csv import requests def get_nested_value(data, path, default='null'): """安全获取嵌套字典的值,路径用列表表示""" current = data for key in path: current = current.get(key, {}) if current == {}: return default return current if isinstance(current, (int, str)) else default urls = ["Uni urls"] # 替换为实际大学URL列表 for url in urls: # 调用WAVE API获取评估数据 response = requests.post( 'https://wave.webaim.org/api/request?key=G2ARAEHw3232', data={"url": url, 'reporttype': 3} ) result_data = response.json() print(f"Result ID for {url} - {response.text}") # 提取所需字段,缺失时自动填充'null' extracted_data = { 'url': url, 'total_elements': get_nested_value(result_data, ['statistics', 'totalelements'], 0), 'error': get_nested_value(result_data, ['categories', 'error', 'count'], 0), 'contrast': get_nested_value(result_data, ['categories', 'contrast', 'count'], 0), 'alert': get_nested_value(result_data, ['categories', 'alert', 'count'], 0), 'feature': get_nested_value(result_data, ['categories', 'feature', 'count'], 0), 'structure': get_nested_value(result_data, ['categories', 'structure', 'count'], 0), 'aria': get_nested_value(result_data, ['categories', 'aria', 'count'], 0), 'alt_null': get_nested_value(result_data, ['categories', 'feature', 'items', 'alt_null', 'count'], 0), 'alt_link_missing': get_nested_value(result_data, ['categories', 'error', 'items', 'alt_link_missing', 'count'], 0), 'link_suspicious': get_nested_value(result_data, ['categories', 'alert', 'items', 'link_suspicious', 'count'], 0), 'link_empty': get_nested_value(result_data, ['categories', 'error', 'items', 'link_empty', 'count'], 0) } # 将数据写入CSV with open('wave_test.csv', 'a', newline='', encoding='utf-8') as csvfile: fieldnames = ['url', 'total_elements', 'error', 'contrast', 'alert', 'feature', 'structure', 'aria', 'alt_null', 'alt_link_missing', 'link_suspicious', 'link_empty'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) # 首次写入时添加表头 if csvfile.tell() == 0: writer.writeheader() writer.writerow(extracted_data) # 验证CSV内容 with open('wave_test.csv', 'r', encoding='utf-8') as file: print(file.read())
关键修改说明
- 新增安全取值函数:
get_nested_value通过逐层遍历嵌套字典,遇到不存在的键时返回默认值null(或指定的数值默认值),彻底避免KeyError。 - 修正写入逻辑:将数据提取和CSV写入放在同一个
with块内,避免因文件句柄关闭导致的写入失败。 - 统一字段提取方式:所有字段均通过安全函数提取,保证缺失字段自动填充指定值,同时避免类型错误。
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

