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