write utf8 unicodeencodeerror u201c u2010 print files codecs charmap characters python python-2.7 unicode beautifulsoup urllib2

utf8 - python write utf 8 files



UnicodeEncodeError: el códec ''ascii'' no puede codificar el carácter u ''/ u2026'' (3)

¿ .decode() o .decode("utf-8") ?

Y, recomiendo usar lxml usando el html5lib parser

http://lxml.de/html5parser.html

Estoy aprendiendo sobre urllib2 y Beautiful Soup y en las primeras pruebas recibo errores como:

UnicodeEncodeError: ''ascii'' codec can''t encode character u''/u2026'' in position 10: ordinal not in range(128)

Parece que hay muchas publicaciones sobre este tipo de error y he intentado con las soluciones que puedo entender, pero parece que hay trampas 22 con ellas, por ejemplo:

Quiero imprimir post.text (donde el texto es un hermoso método de sopa que simplemente devuelve el texto). str(post.text) y post.text producen los errores Unicode (en cosas como '' y ... ) de apóstrofo correcto.

Entonces agrego post = unicode(post) sobre str(post.text) , luego obtengo:

AttributeError: ''unicode'' object has no attribute ''text''

También probé (post.text).encode() y (post.text).renderContents() . Este último produce el error:

AttributeError: ''unicode'' object has no attribute ''renderContents''

y luego probé str(post.text).renderContents() y obtuve el error:

AttributeError: ''str'' object has no attribute ''renderContents''

Sería genial si pudiera definir en algún lugar en la parte superior del documento ''make this content ''interpretable'''' y aún tener acceso a la función de text requerida.

Actualización: después de sugerencias:

Si agrego post = post.decode("utf-8") arriba str(post.text) obtengo:

TypeError: unsupported operand type(s) for -: ''str'' and ''int''

Si agrego post = post.decode() arriba str(post.text) obtengo:

AttributeError: ''unicode'' object has no attribute ''text''

Si agrego post = post.encode("utf-8") arriba (post.text) obtengo:

AttributeError: ''str'' object has no attribute ''text''

Intenté print post.text.encode(''utf-8'') y obtuve:

UnicodeDecodeError: ''ascii'' codec can''t decode byte 0xe2 in position 39: ordinal not in range(128)

Y para intentar cosas que podrían funcionar, instalé lxml para Windows desde here y lo implementé con:

parsed_content = BeautifulSoup(original_content, "lxml")

de acuerdo con http://www.crummy.com/software/BeautifulSoup/bs4/doc/#output-formatters .

Estos pasos no parecen marcar la diferencia.

Estoy usando Python 2.7.4 y Beautiful Soup 4.

Solución:

Después de obtener una comprensión más profunda de los tipos Unicode, utf-8 y Beautiful Soup, tuvo algo que ver con mi metodología de impresión. str(something) + post.text + str(something_else) todos mis métodos str y concatenaciones, por ejemplo, str(something) + post.text + str(something_else) , de modo que era something, post.text, something_else y parece estar bien impreso, excepto que tengo menos control del formato en esta etapa (por ejemplo, espacios insertados en , ).


En Python 2, los objetos unicode solo se pueden imprimir si se pueden convertir a ASCII. Si no se puede codificar en ASCII, obtendrá ese error. Probablemente desee codificarlo explícitamente y luego imprimir el str resultante:

print post.text.encode(''utf-8'')


html = urllib.request.urlopen(THE_URL).read() soup = BeautifulSoup(html) print("''" + str(soup.encode("ascii")) + "''")

trabajó para mi ;-)