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