Python解析API返回字典时如何处理多个缺失键避免KeyError
解决方案
核心思路
编写通用的嵌套结构安全取值工具函数,自动处理取值路径中任意一层的KeyError(字典缺键)、IndexError(列表索引越界)、TypeError(对象不可索引)问题,只要任意一层不存在就直接返回预设的默认值"none",无需为每个字段单独编写try-except块。
具体实现
1. 定义安全取值函数
def safe_get(obj, *path, default="none"): current = obj for key in path: try: current = current[key] except (KeyError, IndexError, TypeError): return default return current
函数使用规则:若需要取值x['contacts'][0]['phone'][0]['value'],只需按路径顺序传入参数即可:safe_get(x, 'contacts', 0, 'phone', 0, 'value')。
2. 替换原有取值逻辑
原有代码仅对网站字段做了异常捕获,电话字段完全没有做缺失处理,是触发报错的核心原因。将所有可能存在缺失的字段都用上述safe_get函数包裹即可。
3. 修改后的完整代码
import requests import geocoder import pprint # 定义安全取值工具函数 def safe_get(obj, *path, default="none"): current = obj for key in path: try: current = current[key] except (KeyError, IndexError, TypeError): return default return current g = geocoder.ip('me') print(g.latlng) latitude, longitude = g.latlng URL = "https://discover.search.hereapi.com/v1/discover" # 此处替换为实际坐标值 latitude = xxxx longitude = xxxx api_key = 'xxxxx' # 从developer.here.com获取 query = 'food' limit = 12 PARAMS = { 'apikey':api_key, 'q':query, 'limit': limit, 'at':'{},{}'.format(latitude,longitude) } # 发送请求获取返回数据 r = requests.get(url = URL, params = PARAMS) data = r.json() for x in data['items']: title = safe_get(x, 'title') address = safe_get(x, 'address', 'label') street = safe_get(x, 'address', 'street') postalCode = safe_get(x, 'address', 'postalCode') position = safe_get(x, 'position') access = safe_get(x, 'access') typeOfBusiness = safe_get(x, 'categories', 0, 'name') # 电话字段缺失处理 contacts = safe_get(x, 'contacts', 0, 'phone', 0, 'value') # 网站字段缺失处理 website = safe_get(x, 'contacts', 0, 'www', 0, 'value') resultList = { 'BUSINESS NAME:':title, 'ADDRESS:':address, 'STREET NAME:':street, 'POSTCODE:':postalCode, 'POSITION:':position, 'POSITSION2:':access, 'TYPE:':typeOfBusiness, 'PHONE:':contacts, 'WEBSITE:':website } print("--"*80) pprint.pprint(resultList)
补充说明
- 若需要将默认值改为Python原生的
None,只需修改safe_get函数的default参数即可 - 后续新增提取字段时,只需按取值路径传参给
safe_get即可,无需新增异常捕获逻辑 - 该方案覆盖了API返回的绝大多数异常场景:字典缺键、列表为空/索引越界、中间节点返回None等情况都能正常处理
内容的提问来源于stack exchange,提问作者primitiveProgrammer
相关产品推荐
相关产品推荐

