Tengo este problema tratando de obtener todos los nodos de texto en un documento HTML utilizando lxml pero obtengo un UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
. Sin embargo, cuando trato de averiguar el tipo de codificación de esta página (encoding = chardet.detect(response)['encoding']
), dice que es utf-8
. Parece raro que una sola página tenga utf-8 y ascii. En realidad, esto:UnicodeEncodeError al recuperar url
fromstring(response).text_content().encode('ascii', 'replace')
resuelve el problema.
Aquí está mi código:
from lxml.html import fromstring
import urllib2
import chardet
request = urllib2.Request(my_url)
request.add_header('User-Agent',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)')
request.add_header("Accept-Language", "en-us")
response = urllib2.urlopen(request).read()
print encoding
print fromstring(response).text_content()
Salida:
utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
¿Qué puedo hacer para solucionar este problema ?. Tenga en cuenta que quiero hacer esto con algunas otras páginas, por lo que no quiero codificar de forma individual.
ACTUALIZACIÓN:
Tal vez hay algo más en juego aquí. Cuando ejecuto este script en el terminal, obtengo una salida correcta pero cuando lo ejecuto dentro de SublimeText, obtengo UnicodeEncodeError ... ¿?
Update2:
También está sucediendo cuando se crea un archivo con esta salida. .encode('ascii', 'replace')
está funcionando pero me gustaría tener una solución más general.
Saludos
¿'print u" \ u00A9 "' dentro de su script también produce el error? – jfs
Sí.UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u '\ xa9' en la posición 0: ordinal no en el rango (128) :-) –
puede establecer PYTHONIOENCODING en cualquier codificación de caracteres que acepte SublimeText. – jfs