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