googletrans库报错:'NoneType' object has no attribute 'group'
问题根因
PyPI源默认推送的googletrans==3.0.0为2020年之后就停止维护的旧版本,其内部硬编码的谷歌翻译网页TKK token提取正则,已经无法匹配谷歌多次迭代后的翻译页面前端结构。正则匹配无结果返回None时,代码未做空值校验直接调用.group()方法,最终触发AttributeError: 'NoneType' object has no attribute 'group'报错,和业务代码、待翻译文本内容本身无关。
排查思路
- 版本校验:执行命令
pip show googletrans查看当前安装版本,若返回版本号为3.0.0,可直接判定为版本适配问题 - 网络校验:确认当前网络可正常访问谷歌翻译服务,排除代理配置错误、请求被拦截导致页面内容加载不全、正则匹配失败的情况
- 逻辑校验:定位报错栈指向的
gtoken.py第62行代码,可看到旧代码未对RE_TKK.search()的返回值做非空判断,直接链式调用group()方法,一旦匹配失败必然抛错
解决方案
方案1:安装适配新版接口的修复版本(优先推荐)
旧版本维护停滞后,社区已有修复适配的发布版本,无需修改原有业务代码,执行以下命令替换安装即可:
pip uninstall googletrans -y pip install googletrans==4.0.0-rc1
安装完成后直接运行原有翻译代码即可正常使用。如果存在偶发请求超时问题,初始化Translator时可增加超时配置:
translator = Translator(timeout=10)
方案2:本地临时修复匹配规则(不推荐)
如果暂时无法替换版本,可手动修改本地安装路径下的gtoken.py文件,找到_update方法内的匹配逻辑,替换为带空值兜底的代码:
# 原报错代码 # code = self.RE_TKK.search(r.text).group(1).replace('var ', '') # 修改后的兜底逻辑 tkk_match = self.RE_TKK.search(r.text) if not tkk_match: self.RE_TKK = re.compile(r"tkk:'(\d+\.\d+)'", re.DOTALL) tkk_match = self.RE_TKK.search(r.text) code = tkk_match.group(1).replace('var ', '')
该方案仅临时生效,后续谷歌调整前端页面结构后会再次失效。
方案3:增加重试与频率控制
批量翻译场景下,短时间高频请求会触发谷歌的反爬拦截,导致返回的页面内容异常、正则匹配失败,可在翻译逻辑中增加重试机制与随机延时,降低报错概率:
import time import random from googletrans import Translator translator = Translator(timeout=15) def safe_translate(text): max_retry = 3 for _ in range(max_retry): try: result = translator.translate(text, dest='en').text time.sleep(random.uniform(0.5, 2)) return result except Exception: time.sleep(2) # 多次重试失败返回原文本,避免整体任务中断 return text df['data'] = df['tweet'].apply(safe_translate)
内容的提问来源于stack exchange,提问作者arkhanreveeas
相关产品推荐
相关产品推荐

