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

如何筛选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且代码不抛出异常。

错误原因

  1. KeyError:部分URL的WAVE评估结果中不存在alt_null这类细分项,直接通过字典索引(result_data['categories']['feature']['items']['alt_null']['count'])会因键不存在报错。
  2. AttributeError:错误地在整数类型的count值上调用.get()方法,整数对象本身没有该方法。
  3. 无效的检查逻辑:原代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:02:26