Python googletrans模块随机报错:原因分析与解决方案
googletrans 翻译异常问题:原因分析与修复方案
问题现象
使用googletrans 4.0.0rc1版本时,翻译请求存在不稳定问题:
- 随机出现
TypeError: the JSON object must be str, bytes or bytearray, not NoneType错误,导致翻译失败 - 当输入文本仅包含空格时,会抛出
IndexError: list index out of range错误
复现代码
import time from googletrans import Translator as google_Translator class Translator: lang: str def __init__(self, lang: str = 'en'): self.lang = lang def go(self, text: str): try: translator = google_Translator() except Exception as e: print("First exception type: ", e) print("Argument: ", text) print("lang: ", self.lang) print("translator: ", translator) return None try: t1 = translator.translate(text, dest=self.lang) except Exception as e: print("Second exception type: ", e) print("Argument: '%s'" % text) print("lang: ", self.lang) print("translator: ", translator) return None try: t2 = t1.text except Exception as e: print("Third exception type: ", e) print("argument: ", text) print("lang: ", self.lang) print("translator: ", translator) return None return t2 if __name__ == '__main__': t = Translator('English') while True: print("\n---\n%s\n---\n" % t.go('Mieux Comprendre, Mieux Décider, Mieux Soigner')) time.sleep(5)
错误示例输出
--- Better understand, decide better, better care --- --- Better understand, decide better, better care --- Second exception type: the JSON object must be str, bytes or bytearray, not NoneType Argument: 'Mieux Comprendre, Mieux Décider, Mieux Soigner' lang: English translator: <googletrans.client.Translator object at 0x109e96d40> --- None ---
环境信息
(venv)$ python3 --version Python 3.10.11 (venv)$ python3 -m pip show googletrans Name: googletrans Version: 4.0.0rc1 Summary: Free Google Translate API for Python. Translates totally free of charge. Home-page: https://github.com/ssut/py-googletrans Author: SuHun Han Author-email: ssut@ssut.me License: MIT Location: ~/venv/lib/python3.10/site-packages Requires: httpx Required-by:
原因分析
- 预发布版本bug:googletrans 4.0.0rc1是候选预发布版本,内部解析Google Translate响应的逻辑存在缺陷。当Google临时调整响应格式,或请求被限流/拦截时,库无法正确解析返回内容,导致JSON解析失败抛出NoneType错误。
- 边缘输入未处理:当输入文本仅为空白字符时,Google Translate的返回结构与正常文本不同,库的解析代码未适配这种情况,直接访问列表索引导致越界。
- 实例重复创建:每次调用翻译方法都新建
google_Translator实例,既降低效率,也会增加被Google限流的概率——独立实例无法复用连接池,请求特征更易被识别拦截。 - 语言参数不规范:代码中使用
'English'作为目标语言参数,虽然库能兼容部分自然语言名称,但标准用法应为语言代码(如'en'),不规范参数可能引发潜在解析问题。
修复方案
方案一:切换到稳定版或替代库
放弃bug较多的4.0.0rc1版本,安装稳定版:
pip uninstall googletrans -y pip install googletrans==3.0.0
若稳定版仍有问题,可使用更成熟的替代库(如googletransx),或使用官方付费的Google Cloud Translate API(稳定性更高)。
方案二:修复现有代码问题
- 复用翻译器实例:在类初始化时创建一次
google_Translator实例,避免重复创建 - 规范语言参数:使用标准语言代码(如
'en')替代自然语言名称 - 处理空白输入:提前过滤空白文本,避免触发边缘异常
- 简化异常处理逻辑
修改后的代码:
import time from googletrans import Translator as google_Translator class Translator: lang: str translator: google_Translator def __init__(self, lang: str = 'en'): self.lang = lang self.translator = None try: self.translator = google_Translator() except Exception as e: print("翻译器初始化失败:", e) def go(self, text: str): if not self.translator: return None # 处理空白输入 stripped_text = text.strip() if not stripped_text: return "" try: result = self.translator.translate(stripped_text, dest=self.lang) return result.text except Exception as e: print("翻译失败:", e) print("输入文本:", repr(text)) print("目标语言:", self.lang) return None if __name__ == '__main__': t = Translator('en') while True: print("\n---\n%s\n---\n" % t.go('Mieux Comprendre, Mieux Décider, Mieux Soigner')) time.sleep(5)
方案三:添加重试机制
针对临时网络波动或限流导致的失败,可添加重试逻辑提升稳定性(需先安装tenacity库:pip install tenacity):
import time from tenacity import retry, stop_after_attempt, wait_exponential from googletrans import Translator as google_Translator class Translator: lang: str translator: google_Translator def __init__(self, lang: str = 'en'): self.lang = lang self.translator = None try: self.translator = google_Translator() except Exception as e: print("翻译器初始化失败:", e) @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10)) def _translate(self, text): return self.translator.translate(text, dest=self.lang).text def go(self, text: str): if not self.translator: return None stripped_text = text.strip() if not stripped_text: return "" try: return self._translate(stripped_text) except Exception as e: print("多次尝试后翻译失败:", e) return None if __name__ == '__main__': t = Translator('en') while True: print("\n---\n%s\n---\n" % t.go('Mieux Comprendre, Mieux Décider, Mieux Soigner')) time.sleep(5)
内容的提问来源于stack exchange,提问作者ginjaemocoes
相关产品推荐
相关产品推荐

