gpt4 book ai didi

Python 请求带有 Unicode 参数的 URL

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:43 25 4
gpt4 key购买 nike

我目前正在尝试访问 google tts url,http://translate.google.com/translate_tts使用请求库在 python 中使用日语字符和短语。

这是一个例子:

http://translate.google.com/translate_tts?tl=ja&q =ひとつ

但是,当我尝试使用 python 请求库下载端点返回的 mp3 时,生成的 mp3 是空白的。我已经验证我可以在使用非 unicode 字符(通过罗马字)的请求中点击此 URL,并且已经得到正确的回复。

这是我用来发出请求的部分代码

langs = {'japanese': 'ja',
'english': 'en'}

def get_sound_file_for_text(text, download=False, lang='japanese'):

r = StringIO()
glang = langs[lang]
text = text.replace('*', '')
text = text.replace('/', '')
text = text.replace('x', '')
url = 'http://translate.google.com/translate_tts'
if download:
result = requests.get(url, params={'tl': glang, 'q': text})
r.write(result.content)
r.seek(0)
return r
else:
return url

此外,如果我在此代码段中打印 texturl,则假名/汉字会在我的控制台中正确呈现。

编辑:

如果我尝试对 unicode 进行编码并引用它,我仍然会得到相同的响应。

# -*- coding: utf-8 -*-

from StringIO import StringIO
import urllib
import requests

__author__ = 'jacob'

langs = {'japanese': 'ja',
'english': 'en'}

def get_sound_file_for_text(text, download=False, lang='japanese'):

r = StringIO()
glang = langs[lang]
text = text.replace('*', '')
text = text.replace('/', '')
text = text.replace('x', '')
text = urllib.quote(text.encode('utf-8'))
url = 'http://translate.google.com/translate_tts?tl=%(glang)s&q=%(text)s' % locals()
print url
if download:
result = requests.get(url)
r.write(result.content)
r.seek(0)
return r
else:
return url

返回这个:

http://translate.google.com/translate_tts?tl=ja&q=%E3%81%B2%E3%81%A8%E3%81%A4

这似乎应该有效,但实际上无效。

编辑 2:

如果我尝试使用 urlllb/urllib2,我会收到 403 错误。

编辑 3:

所以,这个问题/行为似乎只是局限于这个端点。如果我尝试以下 URL,一个不同的端点。

http://www.kanjidamage.com/kanji/13-un-%E4%B8%8D

在请求和我的浏览器中,我得到相同的响应(它们匹配)。如果我什至尝试向服务器发送 ascii 字符,就像这个 url。

http://translate.google.com/translate_tts?tl=ja&q=sayonara

我也得到了相同的响应(它们再次匹配)。但是,如果我尝试向此 URL 发送 unicode 字符,我会在我的浏览器上获得正确的音频文件,但不是来自发送音频文件但没有声音的请求。

http://translate.google.com/translate_tts?tl=ja&q=%E3%81%B2%E3%81%A8%E3%81%A4

那么,这种行为似乎仅限于 Google TTL URL?

最佳答案

用户代理可能是问题的一部分,但在本例中并非如此。 translate_tts 服务拒绝(使用 HTTP 403)某些用户代理,例如任何以 Pythoncurlwget 和其他可能开头的。这就是您在使用 urllib2.urlopen() 时看到 HTTP 403 响应的原因 - 它将用户代理设置为 Python-urllib/2.7(版本可能有所不同)。

您发现将用户代理设置为 Mozilla/5.0 可以解决问题,但这可能会起作用,因为 API 可能会根据用户代理采用特定的编码。

您实际上应该做的是使用 ie 字段明确指定 URL 字符编码。您的 URL 请求应如下所示:

http://translate.google.com/translate_tts?ie=UTF-8&tl=ja&q=%E3%81%B2%E3%81%A8%E3%81%A4

Note the ie=UTF-8 which explicitly sets the URL character encoding. The spec does state that UTF-8 is the default, but doesn't seem entirely true, so you should always set ie in your requests.

The API supports kanji, hiragana, and katakana (possibly others?). These URLs all produce "nihongo", although the audio produced for hiragana input has a slightly different inflection to the others.

import requests

one = u'\u3072\u3068\u3064'
kanji = u'\u65e5\u672c\u8a9e'
hiragana = u'\u306b\u307b\u3093\u3054'
katakana = u'\u30cb\u30db\u30f3\u30b4'
url = 'http://translate.google.com/translate_tts'

for text in one, kanji, hiragana, katakana:
r = requests.get(url, params={'ie': 'UTF-8', 'tl': 'ja', 'q': text})
print u"{} -> {}".format(text, r.url)
open(u'/tmp/{}.mp3'.format(text), 'wb').write(r.content)

关于Python 请求带有 Unicode 参数的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27955978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com