Ho questo problema nel tentativo di ottenere tutti i nodi di testo in un documento HTML usando lxml, ma ottengo un errore UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
. Tuttavia, quando provo a scoprire il tipo di codifica di questa pagina (encoding = chardet.detect(response)['encoding']
), si dice che sia utf-8
. Sembra strano che una singola pagina abbia utf-8 e ascii. In realtà, questo:UnicodeEncodeError durante il recupero dell'URL
fromstring(response).text_content().encode('ascii', 'replace')
risolve il problema.
qui è il mio codice:
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()
uscita:
utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
Cosa posso fare per risolvere questo problema ?. Tieni presente che voglio farlo con poche altre pagine, quindi non voglio codificarlo su base individuale.
UPDATE:
Forse c'è qualcos'altro qui. Quando eseguo questo script sul terminale, ottengo un output corretto ma quando lo eseguo in SublimeText, ottengo UnicodeEncodeError ... ¿?
UPDATE2:
E 'anche accadere quando creo un file con questa uscita. .encode('ascii', 'replace')
sta funzionando, ma mi piacerebbe avere una soluzione più generale.
saluti
"print u" \ u00A9 "' all'interno dello script genera anche l'errore? – jfs
Sì.UnicodeEncodeError: il codec 'ascii' non può codificare il carattere u '\ xa9' in posizione 0: ordinale non compreso nell'intervallo (128) :-) –
è possibile impostare PYTHONIOENCODING su qualsiasi codifica di carattere accettata da SublimeText. – jfs