使用googletrans库翻译DataFrame中荷兰语列时出现TypeError: JSON对象必须为str、bytes或bytearray而非NoneType的解决方法
解决googletrans翻译DataFrame列时的JSON TypeError问题
我来帮你搞定这个TypeError: the JSON object must be str, bytes or bytearray, not NoneType错误——这个坑我之前也踩过,主要和googletrans库的API兼容性、谷歌的反拦截机制,还有文本处理的细节有关,下面给你一步步的解决方案:
1. 优先排查googletrans版本问题
旧版的googletrans(尤其是4.0.0-rc1之后的版本)经常因为谷歌翻译接口更新而失效,导致请求返回None,进而触发JSON解析错误。你可以先降级到稳定的候选版本,或者用社区维护的分支版本:
- 先卸载现有版本:
pip uninstall googletrans -y - 安装稳定的候选版本:
或者使用社区维护的pip install googletrans==4.0.0-rc1googletrans-new:pip install googletrans-new
2. 给翻译逻辑加异常处理和空值校验
即使你确认Content列是字符串类型,也可能存在一些极端情况(比如超长文本、隐藏的空值、特殊字符)导致谷歌翻译返回空结果。自定义一个带异常捕获的翻译函数,能有效避免崩溃:
import pandas as pd from googletrans import Translator # 提前初始化翻译器,避免重复创建实例 translator = Translator() def safe_translate(text): # 先过滤空值或无效文本 if not isinstance(text, str) or pd.isna(text) or text.strip() == "": return "" try: # 执行翻译并返回文本结果 translation = translator.translate(text, src='nl', dest='en') return translation.text except Exception as e: # 打印错误信息方便排查,同时返回空值避免中断 print(f"翻译失败(文本片段:{text[:50]}...):{str(e)}") return "" # 应用安全翻译函数到Content列 df_delpher['Content_en'] = df_delpher['Content'].apply(safe_translate)
3. 检查文本预处理是否有遗漏问题
你之前的标点移除逻辑df_delpher['Content'] = df_delpher['Content'].str.replace(r'[^\w\s]+', '')可能会把某些文本变成空字符串(比如全是标点的内容),虽然你处理了空值,但还是可以在翻译前再加一层过滤:
# 确保Content列都是非空字符串 df_delpher['Content'] = df_delpher['Content'].apply(lambda x: x.strip() if isinstance(x, str) else "") # 再次移除空值行(可选) df_delpher = df_delpher[df_delpher['Content'] != ""]
4. 备选方案:改用谷歌官方Cloud Translation API
如果googletrans始终不稳定,建议使用谷歌官方的翻译API——虽然需要付费,但可靠性拉满,不会出现接口失效的问题:
- 先安装官方库:
pip install google-cloud-translate - 配置谷歌云服务账号密钥(需要在谷歌云控制台创建)
- 编写官方API的翻译函数:
from google.cloud import translate_v2 as translate # 初始化官方翻译客户端 translate_client = translate.Client.from_service_account_json('path/to/your/service-account-key.json') def official_translate(text): if not isinstance(text, str) or pd.isna(text) or text.strip() == "": return "" result = translate_client.translate(text, source_language='nl', target_language='en') return result['translatedText'] df_delpher['Content_en'] = df_delpher['Content'].apply(official_translate)
先试试版本降级和安全翻译函数,大部分情况下都能解决问题;如果还是不行,再考虑切换到官方API。
内容的提问来源于stack exchange,提问作者Mafje101
相关产品推荐
相关产品推荐

