urllib2.urlopen y unicode

Victor Peinado vitojph en gmail.com
Mar Jul 10 13:16:41 CEST 2007


¡Hola a todos!

Estoy tratando de hacer un sencillo wrapper para el traductor
automático Babelfish (http://babelfish.altavista.com). El mecanismo es
sencillo: capturo el resultado de llamar a la página web con una serie
de parámetros (lenguas de origen y destino, cadena a traducir, etc),
los parseo con expresiones regulares para extraer la traducción y
devuelvo la información que me interesa. Os pego el código
simplificado.

La página web que capturo está en utf-8, la misma codificación que mi
script y mi sistema. Sin embargo, parece ser que o bien
urllib2.urlopen o bien el método readlines() en algún momento
transforman todo a cadena sin interpretar correctamente algunos
caracteres, y me salta excepciones de tipo UnicodeDecodeError.

¿Hay alguna forma de preservar el contenido de la página capturada en
su formato original? Gracias de antemano y un saludo.


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
import urllib
import urllib2

class BabelFishWrapper(object):
    transRe = re.compile('''<input type=hidden name="q"
value="(.+)"><input''', re.I | re.M)
    URI = u"http://world.altavista.com/tr"

    def __init__(self, translation_mode):
        self.translation_mode = translation_mode
        self.source_lang, self.target_lang = translation_mode.split(u"_")
        self.args = dict(lp=self.translation_mode, tt=u"urltext",
intl=1, doit="done")

    def translate(self, text):
        self.args[u"urltext"] = text
        self.values = urllib.urlencode(self.args)
        req = urllib2.Request(self.URI, self.values)
        response = urllib2.urlopen(req)
        self.text = u""
        for line in response.readlines():
            # aquí line es <type 'str'>
            self.text += line

        translation = self.transRe.search(self.text).groups()[0]
        return translation


if __name__ == u"__main__":
    bf1 = BabelFishWrapper(u"es_en")
    s1 = u"El niño corre por la calle"         # como entrada tiene
caracteres no ascii
    s2 = u"el caballo es azul"                 # sin problemas
    print s1, "->", bf1.translate(s1)
    print s2, "->", bf1.translate(s2)

    bf2 = BabelFishWrapper(u"en_es")
    s3 = u"I like fish"                        # sin problemas
    s4 = u"The kid is running down the street" # devuelve caracteres no ascii
    print s3, "->", bf2.translate(s3)
    print s4, "->", bf2.translate(s4)


-- 
Víctor Peinado | NLP & IR Group - UNED | http://nlp.uned.es/~victor
Tel (+34) 91 398 8106
Skype/GTalk: vitojph
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es


Más información sobre la lista de distribución Python-es