2011-03-05 19 views
17

Estoy usando BeautifulSoup para extraer algo de texto de un HTML, pero no puedo encontrar la manera de imprimirlo correctamente en la pantalla (o en un archivo).Imprimir una cadena codificada en utf-8

Así es como mi clase que contiene el texto siguiente aspecto:

class Thread(object): 
    def __init__(self, title, author, date, content = u""): 
     self.title = title 
     self.author = author 
     self.date = date 
     self.content = content 
     self.replies = [] 

    def __unicode__(self): 
     s = u"" 

     for k, v in self.__dict__.items(): 
      s += u"%s = %s " % (k, v) 

     return s 

    def __repr__(self): 
     return repr(unicode(self)) 

    __str__ = __repr__ 

Al intentar imprimir una instancia de Thread aquí es lo que veo en la consola:

~/python-tests $ python test.py 
u'date = 21:01 03/02/11 content = author = \u05d3"\u05e8 \u05d9\u05d5\u05e0\u05d9 \u05e1\u05d8\u05d0\u05e0\u05e6\'\u05e1\u05e7\u05d5 replies = [] title = \u05de\u05d1\u05e0\u05d4 \u05d4\u05de\u05d1\u05d7\u05df ' 

Lo que intento no puedo conseguir el resultado que quisiera (el texto anterior debe ser hebreo). Mi objetivo final es serializar Thread en un archivo (usando json o pickle) y poder leerlo de nuevo.

Estoy ejecutando esto con Python 2.6.6 en Ubuntu 10.10.

+0

Me encontré con un problema similar el otro día cuando intentaba escribir en un documento CSV con el módulo csv. AGAVE. Pero 'encode()' es el camino a seguir. –

+0

tuve el mismo problema, pero se trataba de no tener 'charset = utf8' en mi conexión mysql! – kommradHomer

Respuesta

17

Para enviar una cadena Unicode a un archivo (o la consola), debe elegir una codificación de texto . En Python la codificación de texto por defecto es ASCII, sino apoyar caracteres hebreos es necesario utilizar una codificación diferente, como UTF-8:

s = unicode(your_object).encode('utf8') 
f.write(s) 
+0

Yo soy; El resultado que ve es el resultado de 'print a_thread'. – daniel

+0

Internamente 'print x' llama a' x .__ str__' y en su clase ha definido '__str__' para que sea lo mismo que' __repr__'. –

+0

¿Qué debería hacer '__str__' luego? Si estoy leyendo los documentos correctamente, no debería devolver un objeto 'unicode'. – daniel

7

Una buena alternativa a la respuesta de @ marca es establecer la variable de entorno PYTHONIOENCODING=UTF-8.

c.f. Writing unicode strings via sys.stdout in Python.

+0

¡Sí! Pero os.putenv ('PYTHONIOENCODING', 'UTF-8') en el programa no funcionó para mí? – tbc0

Cuestiones relacionadas