У меня возникла эта проблема при попытке получить все текстовые узлы в HTML-документе с помощью lxml, но я получаю UnicodeEncodeError: кодек ascii не может кодировать символ u'\ xe9' в позиции 8995: порядковый номер не в диапазоне(128)
. Однако, когда я пытаюсь выяснить тип кодировки этой страницы (encoding = chardet.detect(response)['encoding']
), он говорит, что это utf-8
. Кажется странным, что на одной странице есть utf-8 и ascii. На самом деле, это:
fromstring(response).text_content().encode('ascii', 'replace')
решает проблему.
Вот мой код:
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()
Вывод:
utf-8
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 8995: ordinal not in range(128)
Что я могу сделать, чтобы решить эту проблему? Имейте в виду, что я хочу сделать это с несколькими другими страницами, поэтому я не хочу кодировать по отдельности.
ОБНОВЛЕНИЕ :
Возможно, здесь происходит что-то еще. Я запускаю этот скрипт на терминале, я получаю правильный вывод, но когда я запускаю его внутри SublimeText, я получаю UnicodeEncodeError... ¿?
UPDATE2:
Это также происходит, когда я создаю файл с этим выводом. .encode('ascii', 'replace')
работает, но я хотел бы иметь более общее решение.
С уважением