zoukankan      html  css  js  c++  java
  • 使用 Google API 进行翻译的 Python 小工具

    因为能及时地完成这个小工具,全靠在网上找到一些代码来用,所以,也把自己完成的东西回馈给网络。:)

    之前有这么一个小需求,要大量地翻译一些零散的句子,对于翻译的质量并不在意,直接采用翻译工具的结果就可以了。但是量很大,于是就想着用 Google 的翻译 API 来做。一开始想用 JavaScript 来写的,但由于只会 JavaScript 的对 Google 翻译 API 的异步调用方式,不知道如何才能进行批量的翻译。

    于是决定用 Python 的来实现。先从网上抄了一些现成的代码(主要是参考这篇),但都不能正确地得到结果。由于稍微做了一些修改,使之能正常地运行得到翻译的结果,代码如下:

              
    
    import urllib,urllib2
    from sgmllib import SGMLParser
    
    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 'tts_button' in id:
                self.open = True
        def handle_data(self, text):
            if self.open:
                self.result.append(text)
                self.open = False
    
    def Translate(text, f, t):
        MySentence = []   
        values = {'hl':'zh-CN','ie':'UTF-8',
             'text':text,'langpair':"%s|%s"%(f, t)}
        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)
        parser = URLLister(MySentence)
        parser.feed(response.read())
        parser.close() 
        return MySentence
        
    def TranlateForIgnorException(text):
        excpCnt = 0
        while 1:
            try:
                arStr = Translate(langStr, "en", "ar")[0]
                break
            except:
                excpCnt = excpCnt + 1                    
                if excpCnt > 10:
                    break
                time.sleep(2)
        return arStr
    
    if __name__ == "__main__":
        ArStr = TranlateForIgnorException("This")

    函数 Translate (第20行),是模拟浏览器向 google 发出 http 的请求。第一个参数是需要翻译的句子,第二、三个参数是原语言和目标语言,分别是一定预选定义好的字符串(英文是 "en",阿拉伯语是"ar",简体中文是'zh-CN'等),完整的定义在 Google 翻译 API 的文档中有描述。返回值是翻译后的字符串,是 UTF8 的编码。这个函数可以看成是同步的。

    我在使用的时候,把要翻译的句子读入一个 list 中,然后依次进行翻译。连续调用的时候,很容易出现 http 506 错误的异常。我不知道如何正确地处理它,于是我用了另一个函数(第33行)TranlateForIgnorException ,当出现异常时就再进行一次翻译,直到翻译成功为止,或是,异常连续出现 10 次(因为有的句子无法进行翻译,比如,带有"http://"这样网址的字符串)。

    另外一点需要说明的是,原来在网上抄的代码中,解析 html 文件得到翻译后字符串的部分有点问题,问题是在第 13 行代码处,原来的代码是以'result_box' 为标签时进行抽取,但我使用后发现不太对,于是把 google 发回的整个 html 文件存下来,查看后发现,翻译后文字是存在 'tts_button' 为 id 的 div 标签中的。所以我进行了修改,我不保证这个绝对正确,如果您发现有不对的地方,可以试着从这些看看。

     

    ---- 总会有一个人需要你的分享~! 唐风: www.cnblogs.com/muxue ------
  • 相关阅读:
    SP笔记:交叉实现七行并成一行
    HTML tag 学习
    操作哈希表
    Efficient bipedal robots based on passivedynamic walkers
    Pushing People Around
    ZEROMOMENT PONTTHIRTY FIVE YEARS OF ITS LIFE

    Active Learning for RealTime Motion Controllers
    Accelerometerbased User Interfaces for the Control of a Physically Simulated Character
    Dynamic Response for Motion Capture Animation
  • 原文地址:https://www.cnblogs.com/muxue/p/1775015.html
Copyright © 2011-2022 走看看