Python Google应用程序引擎UrlFetch-URL中带有特殊字符的问题
我正在使用Google Translate将一段文本转换为具有以下url的语音:Python Google应用程序引擎UrlFetch-URL中带有特殊字符的问题,python,google-app-engine,urlfetch,Python,Google App Engine,Urlfetch,我正在使用Google Translate将一段文本转换为具有以下url的语音: http://translate.google.com/translate_tts?tl=%s&q=%s 其中,参数tl包含要转换为语音的文本语言的语言代码,q包含要转换的文本 正常单词(无特殊字符)返回正确的音频文件。 因此,在我的应用程序中,我就是这样做的(no是挪威语的语言代码): 这将返回正确的声音。 顺便说一句,我正在使用普通的webapp 但是,当我有一个带有特殊字符的单词(vår)时,有些东西就不对了
http://translate.google.com/translate_tts?tl=%s&q=%s
其中,参数
tl
包含要转换为语音的文本语言的语言代码,q
包含要转换的文本
正常单词(无特殊字符)返回正确的音频文件。因此,在我的应用程序中,我就是这样做的(
no
是挪威语的语言代码):
这将返回正确的声音。顺便说一句,我正在使用普通的webapp 但是,当我有一个带有特殊字符的单词(vår)时,有些东西就不对了。 生成的url是
http://translate.google.com/translate_tts?tl=no&q=v%C3%A5r
。(å正确转换为百分比编码)当用浏览器打开该url时,我得到了正确的声音,但当使用urlfetch.fetch读取同一url时,返回的声音不正确
这里出了什么问题?我只能假设fetch正在以某种方式改变url。显然,问题不是应用程序引擎的问题,而是Google Translate url处理不同用户代理的方式 例如:
#!/usr/bin/env python
#coding=utf-8
import urllib
class MyOpener(urllib.FancyURLopener):
version = "App/1.7" #doesn't work
version = "Mozilla/4.0 (MSIE 6.0; Windows NT 5.0)2011-03-10 15:38:34" #works
def textToSpeech(text, languageCode='en'):
url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % (languageCode, urllib.quote(text))
myopener = MyOpener()
return myopener.open(url, 'rb').read()
open('urllib.mp3', 'wb').write(textToSpeech('vår', 'no'))
为MyOpener使用Firefox用户代理字符串时,一切正常,但使用其他用户字符串时,返回的声音不正确。什么功能是
quote
?您是否尝试过为某个应用程序的编码字符串创建urlfetch,在该应用程序中您可以看到获取的结果URL(例如,您自己的应用程序)?我使用的是urllib.quote。我按照你的要求做了,结果是一样的。似乎url没有被更改:/Err,经过一番探索后,我想我发现了问题所在。。将用户代理更改为Firefox代理后,一切正常。。下面是一个说明问题的代码示例:更改UrlOpener的version属性并了解结果如何更改。还用我的Appengine应用程序测试了它,这确实是问题所在。。。你知道为什么会这样吗?我有点好奇。我不知道,但我只能假设一些浏览器对unicode编码不正确,所以API就是基于这一点来区分的。
#!/usr/bin/env python
#coding=utf-8
import urllib
class MyOpener(urllib.FancyURLopener):
version = "App/1.7" #doesn't work
version = "Mozilla/4.0 (MSIE 6.0; Windows NT 5.0)2011-03-10 15:38:34" #works
def textToSpeech(text, languageCode='en'):
url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % (languageCode, urllib.quote(text))
myopener = MyOpener()
return myopener.open(url, 'rb').read()
open('urllib.mp3', 'wb').write(textToSpeech('vår', 'no'))