python - 脚本中的 UTF8 不匹配
问题描述
我对 Python 脚本有疑问。我只是尝试用谷歌翻译 API 翻译一些句子。有些句子在特殊的 UTF-8 编码(如 ä、ö 或 ü)上存在问题。无法想象为什么有些句子有效,有些则无效。
如果我直接在浏览器中尝试 API 调用,它可以工作,但是在我的 Python 脚本中,我得到了一个不匹配的结果。
这是我的脚本的一个小版本,它直接显示错误:
# -*- encoding: utf-8' -*-
import requests
import json
satz="Beneath the moonlight glints a tiny fragment of silver, a fraction of a line…"
url = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=de&dt=t&q='+satz
r = requests.get(url);
r.text.encode().decode('utf8','ignore')
n = json.loads(r.text);
i = 0
while i < len(n[0]):
newLine = n[0][i][0]
print(newLine)
i=i+1
这就是我的结果的样子:
Unter dem Mondschein glänzt ein winziges Silberfragment, ein Bruchteil einer Li
nie â ? |
解决方案
Google 为您提供了Mojibake;JSON 响应包含原始使用 UTF-8 编码但随后使用不同的编解码器解码导致数据不正确的数据。
我怀疑谷歌在解码 URL 参数时会这样做;过去 URL 参数可以用任意数量的编解码器进行编码,现在 UTF-8 是一个相对较新的标准。这是 Google 的错,不是你的错,也不是requests
.
我发现设置User-Agent
标题会让 Google 表现得更好;即使是(不完整的)用户代理Mozilla/5.0
也足以让 Google 在解码您的 URL 参数时使用 UTF-8。
您还应该确保您的 URL 字符串是正确的百分比编码,如果您在字典中传递参数,params
那么requests
将负责将这些参数正确添加到 URL:
satz = "Beneath the moonlight glints a tiny fragment of silver, a fraction of a line…"
url = 'https://translate.googleapis.com/translate_a/single?client=gtx&dt=t'
params = {
'q': satz,
'sl': 'en',
'tl': 'de',
}
headers = {'user-agent': 'Mozilla/5.0'}
r = requests.get(url, params=params, headers=headers)
results = r.json()[0]
for inputline, outputline, *__ in results:
print(outputline)
请注意,我也将源语言和目标语言参数提取到params
字典中,并从结果列表中提取了输入和输出行值。
推荐阅读
- vba - 在 Microsoft Access 报告中的每个组之后重新编号页码
- html - 使用带跨度的过渡?
- python - Pyspark - 保留收集列表的顺序并在多列上收集集合
- neo4j - Neo4J - 多个联合的后分页
- javascript - 回调函数不会自动重新渲染反应组件页面
- python-3.x - 运行迁移时出现 sqlalchemy.exc.ArgumentError
- amazon-web-services - SQS 延迟是否适用于 FIFO 队列的队列级别或消息组级别?
- jquery - 使用 load() 在 Jquery 中仅查找并加载第 n 个 div
- github - 按唯一用户过滤提交
- api - 如何使用 api 将事件从 misp 导出到 csv 文件