• 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:

Python语言: POST数据

import urllib,urllib2

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了!)

Python语言: 解析URL

class URLLister(SGMLParser):

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的翻译很智能,能把简体对繁体一对多的问题也能搞定!):

Tags: google, Python.

» You can leave a comment.

2 Pingbacks

17 Comments

  1. vilinov

    很强大。

  2. 嗯...需要在wp里面保持格式请用code标签或者pre标签....
    再配合WP-Syntax插件...很棒了。

  3. 罗天

    嗯嗯,要是写个Ubuntu Tweak代码解析,肯定火!

  4. Vayn

    @罗天
    有人写过哦
    http://forum.ubuntu.org.cn/viewtopic.php?t=125259

  5. Vayn

    不知道这个工具什么时候发布,看起来很棒。
    原来一直使用Baidu的词典,最近Google新发布的在线词典功能超级强大,现在除了搜mp3已经可以不去Baidu了

  6. ie = input encoding 输入编码, 即向google post数据时的字符编码
    对应的还有:
    oe = output encoding 输出编码

  7. 这样就可以学习繁体拉?哈哈

  8. 请整合

    http://www.shuge.org/lee/posts/chinese2pinyin.html

  9. 强 我要做的话 肯定是嵌入一个浏览器然后再ajax

  10. (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')

  11. 偶发现,如果换成Firefox的Agent就不能用了。result_box的innerHTML不对。原因不明

  12. 嗯,和fcitx冲突,不能输入,就把它搞成命令行的了,还是谢谢了

  13. 幽隐之贤

    Google 能把这个做好,输入法的简繁处理不好,真是……

  14. 那个解析已经不行了。

  15. 棉花团

    能把源码分享一下吗,我想改进一下。

  16. zhaoyong

    感谢你写的代码和blog,我添加了读翻译功能,真不错,呵呵

Leave a Comment