urllib2.urlopen y unicode

Victor Peinado vitojph en gmail.com
Mar Jul 10 16:27:37 CEST 2007


Me auto-respondo. Por el momento, ha bastado con sustituir la línea:

self.text += line

por:

self.text += unicode(line, "iso-8859-15")

On 7/10/07, Victor Peinado <vitojph en gmail.com> wrote:
> ¡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
>


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