Python调用有道翻译接口取返回值时报KeyError: '1'如何解决?
问题修复方案
核心原因
KeyError: '1' 说明接口返回的 response 结构和预期不符,response['data'] 中不存在键为 1 的值。
排查&修复步骤
- 第一步:替换不安全的
eval解析方式,新增调试打印逻辑
直接用eval解析接口返回内容风险极高,且容易因为返回内容格式异常得到错误结构,改为用json.loads解析,同时先打印完整的接口返回内容确认结构,可参考调整后的代码:
import urllib import urllib2 import json from collections import OrderedDict # 新增请求头,模拟浏览器访问避免被反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } myDict = {} lemma_word_pair = OrderedDict() for line in original_text: if len(line)>10: myDict['1'] = {"src":line,"tag":"P"} postdata = { 'data':json.dumps({'1':myDict['1']}), 'type':'X', 'ue':'UTF-8' } data = urllib.urlencode(postdata) # 构造带请求头的请求对象 req = urllib2.Request("http://fanyi.youdao.com/web2/index.do", data=data, headers=headers) resp_content = urllib2.urlopen(req).read() # 打印原始返回内容,方便排查结构问题 print("接口返回原始内容:", resp_content) # 用json.loads替代eval,安全且规范 try: response = json.loads(resp_content) except json.JSONDecodeError as e: print("返回内容不是合法JSON:", e) continue # 取值前先判断键是否存在,避免触发KeyError if 'data' in response and '1' in response['data']: word_count = len(response['data']['1']) else: print("返回结构不符合预期,response完整内容:", response) # 可自行补充错误处理逻辑,比如跳过当前行、重试请求等 continue
- 第二步:确认接口规则是否变更
你当前调用的是有道未公开的内部接口,如果新增请求头后还是返回异常结构,说明接口的请求参数规则已经调整,比如现在需要额外传入签名、时间戳等校验参数,或者接口路径已经下线。
长期使用建议
如果是需要稳定运行的场景,不要依赖这类未公开的内部接口,建议申请有道翻译官方开放API,按照官方文档要求构造合规请求,避免接口规则临时调整导致代码失效。
内容的提问来源于stack exchange,提问作者sunwenxuan
相关产品推荐
相关产品推荐

