Mam ten problem, próbując uzyskać wszystkie węzły tekstowe w dokumencie HTML za pomocą lxml, ale otrzymuję UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
. Jednak gdy próbuję znaleźć kodowanie tej strony (encoding = chardet.detect(response)['encoding']
), jest napisane, że jest to utf-8
. Wydaje się dziwne, że jedna strona ma utf-8 i ascii. W rzeczywistości:UnicodeEncodeError przy pobieraniu adresu URL
fromstring(response).text_content().encode('ascii', 'replace')
rozwiązuje problem.
Tu jest mój kodu:
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()
wyjściowa:
utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
Co mogę zrobić, aby rozwiązać ten problem ?. Pamiętaj, że chcę to zrobić na kilku innych stronach, więc nie chcę kodować osobno.
UPDATE:
Może jest coś innego dzieje się tutaj. Kiedy uruchamiam ten skrypt na terminalu, otrzymuję prawidłowy wynik, ale gdy uruchamiam go wewnątrz SublimeText, otrzymuję UnicodeEncodeError ... ¿?
Update2:
To samo dzieje się, gdy tworzę plik z tego wyjścia. .encode('ascii', 'replace')
działa, ale chciałbym mieć bardziej ogólne rozwiązanie.
Pozdrowienia
Czy "print u" \ u00A9 "' wewnątrz twojego skryptu również powoduje błąd? – jfs
Tak.UnicodeEncodeError: kodek 'ascii' nie może kodować znaków u '\ xa9' w pozycji 0: porządkowy nie w zakresie (128) :-) –
możesz ustawić PYTHONIOENCODING na dowolny kod znaków akceptowany przez SublimeText. – jfs