复杂嵌套JSON解析出现KeyError: 'notes'报错如何解决
Python requests解析接口返回KeyError: 'notes'解决方案
报错根因
- 字段路径错误:从给出的响应片段可以看到,
notes不是联系人对象的顶层字段,它嵌套在contact["qualification"]数组的子元素中,直接在contact顶层用contact["notes"]取值必然触发KeyError。 - 无容错逻辑:原代码所有字段都用方括号强取,只要任意联系人条目缺少对应字段、或者字段值为null,都会直接抛出错误中断整个程序。
- 隐藏逻辑bug:原代码url硬编码了
page=1,循环中的page参数没有实际传入请求,永远只会爬取第一页数据。
修复后代码
import requests base_url = "https://teams-api.grip.events/1/team/53806/event/123721/member/236388/contact/inbound_lead/reviewed" headers = { 'authorization': 'Bearer eaf3bd4b-6861-4ca2-a86e-3a96c73deac0', } with open("list31.txt", "w", encoding='utf-8') as f: for page in range(1, 1000): # 动态传入页码参数 resp = requests.get(url=base_url, headers=headers, params={"page": page}) resp_data = resp.json() contacts = resp_data.get("data", []) # 返回空数据时直接终止翻页 if not contacts: break for contact in contacts: # 提取嵌套的notes字段,兼容数组为空、字段缺失的情况 qualification_list = contact.get("qualification", []) notes_val = "" if qualification_list: notes_val = qualification_list[0].get("notes", "") # 按顺序拼接所有字段,缺省值统一为空字符串 row = [ contact.get("company_name", ""), contact.get("location", ""), contact.get("summary", ""), contact.get("job_title", ""), contact.get("name", ""), contact.get("job_industry", ""), contact.get("email", ""), contact.get("first_name", ""), contact.get("last_name", ""), notes_val ] # 处理null值,避免写入"None"文本 format_row = "\t".join([str(item) if item is not None else "" for item in row]) f.write(format_row + "\n") print(format_row)
关键修复点说明
- 修正
notes字段取值逻辑:从嵌套的qualification数组中提取,兼容数组为空、字段不存在的场景 - 全字段增加容错:所有字段都用
字典.get(字段名, 默认空值)的方式取值,不会因为个别条目缺字段触发KeyError - 修复翻页失效问题:移除url中硬编码的page参数,通过requests的params参数动态传入页码
- 增加空页终止逻辑:当接口返回空联系人列表时直接停止循环,避免无效请求
- 增加null值处理:接口返回null的字段会自动转为空字符串,不会把None字样写入导出文件
内容的提问来源于stack exchange,提问作者Tori Elstrom
相关产品推荐
相关产品推荐

