Python使用Unicode参数请求URL
我目前正在尝试使用请求库使用python中的日语字符和短语访问google tts url 以下是一个例子: =ひとつ 但是,当我尝试使用python请求库下载端点返回的mp3时,得到的mp3是空的。我已经验证了我可以在使用非unicode字符的请求中点击这个URL(通过romanji),并得到了正确的响应 下面是我用来发出请求的代码的一部分Python使用Unicode参数请求URL,python,unicode,python-requests,Python,Unicode,Python Requests,我目前正在尝试使用请求库使用python中的日语字符和短语访问google tts url 以下是一个例子: =ひとつ 但是,当我尝试使用python请求库下载端点返回的mp3时,得到的mp3是空的。我已经验证了我可以在使用非unicode字符的请求中点击这个URL(通过romanji),并得到了正确的响应 下面是我用来发出请求的代码的一部分 langs = {'japanese': 'ja', 'english': 'en'} def get_sound_file_for_
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
此外,如果我在这个代码段中打印文本
或url
,那么我的控制台中的假名/汉字就会正确呈现
编辑:
如果我尝试对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
其中返回以下内容:
这看起来应该行得通,但行不通
编辑2:
如果我尝试使用URLLB/urllib2,我会得到一个403错误
编辑3:
因此,似乎这个问题/行为仅限于此端点。如果我尝试以下URL,则会出现另一个端点
从请求和浏览器中,我得到了相同的响应(它们匹配)。如果我尝试将ascii字符添加到服务器,比如这个url
我也得到了同样的回答(他们再次匹配)。但是,如果我尝试向这个URL发送unicode字符,我会在浏览器上得到一个正确的音频文件,但不会从请求中得到,请求会发送一个音频文件,但没有声音
因此,这种行为似乎仅限于Google TTL URL?我以前使用过这个小方法来帮助我进行UTF-8编码。我在向CSV打印cyrllic和CJK语言时遇到问题,这就成功了
def assist(unicode_string):
utf8 = unicode_string.encode('utf-8')
read = utf8.decode('string_escape')
return read ## UTF-8 encoded string
另外,确保在.py的开头有这两行
#!/usr/bin/python
# -*- coding: utf-8 -*-
第一行只是一个很好的python习惯,它指定在.py上使用哪个编译器(只有当您的机器上加载了多个python版本时才有用)。第二行指定python文件的编码。对此给出了一个稍长的回答。将用户代理设置为Mozilla/5.0可以解决此问题
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', '')
url = 'http://translate.google.com/translate_tts'
if download:
result = requests.get(url, params={'tl': glang, 'q': text}, headers={'User-Agent': 'Mozilla/5.0'})
r.write(result.content)
r.seek(0)
return r
else:
return url
用户代理可能是问题的一部分,但在本例中并非如此。
translate\u tts
服务拒绝(使用HTTP 403)某些用户代理,例如以Python
、curl
、wget
开头的任何用户代理,以及可能的其他用户代理。这就是为什么在使用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
您的控制台可能没有正确配置以显示字符,这听起来像是一般的utf-8编码问题。我能问一下你的操作系统是什么吗?即使我很确定你在windows机器上。@AustinA它在我的控制台上显示得很好。这是pycharm中的一个控制台,我目前正在linux环境中运行。嘿,抱歉@jab,我误读了您的“被呈现”为“未呈现”。不管怎样,我希望我添加的代码片段能够正常工作。我不确定您是否事先尝试UTF-8编码和解码。另外请注意,如果您尝试使用 なな. 它将返回一个“e”音,就像角色一样え. 我尝试过的其他方法都不会返回任何结果。我尝试过将unicode编码为utf-8,但仍然得到相同的行为。:/您尝试过将输出写入文本文件吗?我很想听听结果。当我使用带有utf-8编码URL的请求库时,我会得到一个空白的mp3文件(但mp3详细信息在那里)。如果使用urllib2/httplib2传递相同的URL,则会出现403错误。
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)