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