Google App Engine UrlFetch - 包含特殊字符的网址存在问题

时间:2011-03-09 21:34:02

标签: python google-app-engine urlfetch

我正在使用谷歌翻译将这段文字转换为语音:
http://translate.google.com/translate_tts?tl=%s&q=%s
参数tl包含您要转换为语音的文字语言的语言代码,q包含您要转换的文字。

普通单词(没有特殊字符)会返回正确的音频文件 所以在我的应用程序中这就是我所做的(no是挪威语的语言代码):

url = "http://translate.google.com/translate_tts?tl=%s&q=%s" % ('no', urllib.quote('kjendis'))
#url = http://translate.google.com/translate_tts?tl=no&q=kjendis
self.response.headers["Content-Type"] = "audio/mpeg"
self.response.out.write(urlfetch.fetch(url).content)

返回正确的声音 我正在使用普通的webapp btw。

但是当我在其中有一个特殊字符(vår)时,某些事情是不对的。 生成的网址为http://translate.google.com/translate_tts?tl=no&q=v%C3%A5r。 (å正确转换为百分比编码)
当我用浏览器打开该URL时,我得到了正确的声音,但是当使用urlfetch.fetch读取相同的url时,返回的声音不正确。

这里出了什么问题?我只能假设fetch正在以某种方式改变url。

1 个答案:

答案 0 :(得分:0)

显然问题不是App Engine问题,而是与Google Translate网址处理不同用户代理的方式有关。

一个例子:

#!/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用户代理字符串时,一切都按预期工作,但是当使用其他用户字符串时,返回的声音不正确。