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")  

          

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を発行するリクエストです.1つ目のパラメータは翻訳が必要な文で、2つ目、3つ目のパラメータは元の言語とターゲット言語で、それぞれ一定の予選で定義された文字列(英語は「en」、アラビア語は「ar」、簡体字中国語は「zh-CN」など)であり、完全な定義はGoogle翻訳APIの文書に記述されている.戻り値は翻訳された文字列であり、UTF 8の符号化である.この関数は同期と見なすことができる.
私が使っている間に、翻訳する文をリストに読み込んで、順番に翻訳します.連続呼び出しの場合、http 506エラーの異常が発生しやすい.私はそれをどのように正しく処理するか分からないので、別の関数(33行目)TranlateForIgnorExceptionを使って、異常が発生したときにもう一度翻訳を行い、翻訳が成功するまで、あるいは、異常が10回連続して現れた(例えば、「http://t」のようなURLの文字列があるため).
もう一つ説明したいのは、ネット上で写したコードの中でhtmlファイルを解析して翻訳した文字列の部分に問題があるということです.問題は13行目のコードで、元のコードは'rsult_box'はラベルの時に抽出しますが、私が使った後にあまり正しくないことを発見して、そこでgoogleの送り返したhtmlファイル全体を保存して、見てみると、翻訳した後に文字は'tts_が存在しますbutton'はidのdivラベルにあります.だから私は修正して、私はこれが絶対に正しいことを保証しません.もしあなたが間違っているところを見つけたら、これらから見てみてください.
 
本文はCSDNブログから来て、転載して出典を明記してください:http://blog.csdn.net/liyiwen007/archive/2010/07/10/5726152.aspx