- 10
- Oct
星际译王不知道从哪个版本开始“全文翻译”处的“谷歌翻译”就不能用了,最近频繁使用这个功能。每次进入Google Translate再进行查询真是麻烦。
因为不会C++,也没打算去解决星际译王的这个问题。所以决定自己写个简单易用的脚本来实现Google翻译。
忙忽了一个下午,基本上已经完成了。
-----
写之前找了一些资料,有看到Google提供了Translate的API,不过那是给网络应用提供的Ajax API。我要在本地实现,就要另寻他路。
后来发现好像只有POST并获取数据并解晰这一过程可做,于是就开始编码。
我用Python来模拟浏览器的行为,向Google Translate的主页Post相关词典数据,这些词典是:
- hl:不懂是什么的缩写,就是浏览器/操作系统的语言,默认是zh-CN;
- ie:IE?好怪。默认是UTF-8;
- text:就是要求Google翻译的字符串;
- langpair:语言对,以“zh-CN|zh-TW”为例,即将简体中文翻译成繁体中文。
好了,下面的代码演示了如何Post:
values={'hl':'zh-CN','ie':'UTF-8','text':text,'langpair':"%s|%s" % (lin, lout)}
url='http://translate.google.cn/translate_t'
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
req.add_header('User-Agent', "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)")
response = urllib2.urlopen(req)
上面的代码演示了将“Hello world!”发出去,求Google Translate将其以“英文->简体中文”的形式翻译。
其中urlib.urlencode用于将词典数据转义成URL专用的格式,如上面就变成了:
'langpair=en%7Czh-CN&text=Hello+World%21&ie=UTF-8&hl=zh-CN'
然后用URL和数据生成一个request,并用伪装成IE 6.0的客户端来发出请求(如果不伪装的话Google会返回一个403禁止!)。
OK,试着把返回的response read()一下,标准的HTML文档就出来了。下面是问题是如何解析这个HTML文件,并从中得到想要用数据了。
仔细分析了一下这个数据,发现结果在两个地方,一个是id为result_box的标签,一个是在suggestion的标签。其中网页上显示的是result_box,那么就解析result_box这个吧。(不知道能不能使用正则表达式的方法搞定?)
(可恶的WordPress又把空格吃掉了,看样子我一定要换成Django了!)
def __init__(self, result):
SGMLParser.__init__(self)
self.result = result
self.open = False
def start_div(self, attrs):
id = [v for k, v in attrs if k=='id']
if 'result_box' in id:
self.open = True
def handle_data(self, text):
if self.open:
self.result.append(text)
self.open = False
上面的代码很简单,也足够用。就是开始div标签的时候,再留意id属性,如果属性为result_box,就打开通道,把数据放进结果列表中。于是我要的数据就取出来了。
核心的代码就这么点,再套个Pygtk写的GUI,终于可以非常迅速的完成翻译工作喽!
GUI还只是勉强能用,就迫不及待写这篇文章了,待GUI完善了再公布所有代码。
效果如下图(Google的翻译很智能,能把简体对繁体一对多的问题也能搞定!):

很好。
很强大。
嗯...需要在wp里面保持格式请用code标签或者pre标签....
再配合WP-Syntax插件...很棒了。
嗯嗯,要是写个Ubuntu Tweak代码解析,肯定火!
@罗天
有人写过哦
http://forum.ubuntu.org.cn/viewtopic.php?t=125259
不知道这个工具什么时候发布,看起来很棒。
原来一直使用Baidu的词典,最近Google新发布的在线词典功能超级强大,现在除了搜mp3已经可以不去Baidu了
ie = input encoding 输入编码, 即向google post数据时的字符编码
对应的还有:
oe = output encoding 输出编码
这样就可以学习繁体拉?哈哈
请整合
http://www.shuge.org/lee/posts/chinese2pinyin.html
强 我要做的话 肯定是嵌入一个浏览器然后再ajax
(17:19:19) lidaobing@gmail.com:
最后那个 a 是 gbk 编码的
(17:19:28) lidaobing@gmail.com:
for a in tp.results:
print a.decode('gbk').encode('utf8')
偶发现,如果换成Firefox的Agent就不能用了。result_box的innerHTML不对。原因不明
嗯,和fcitx冲突,不能输入,就把它搞成命令行的了,还是谢谢了
Google 能把这个做好,输入法的简繁处理不好,真是……