Python UTF-8 ошибка декодирования HTML - PullRequest
0 голосов
/ 29 января 2012

Я пытаюсь использовать urllib2 для загрузки веб-страницы и сохранения ее в базе данных MySQL. как это:

result_text = result.read()
result_text = result_text.decode('utf-8')

однако я получаю эту ошибку:

Данные: кодек utf8 не может декодировать байт 0x88

Теперь метатег HTML указывает, что кодировка действительно utf-8. Мне удалось обойти это с помощью этой строки:

result_text = result_text.decode('utf-8','replace')

Что заменяет плохих персонажей. однако я не уверен, что это не является признаком того, что что-то может быть не так с загруженными данными или что я удаляю ценные символы. IU должен добавить, что страница также содержит JavaScript - хотя я не думаю, что это должно быть проблемой.

Может кто-нибудь сказать мне, почему это происходит? Спасибо

1 Ответ

0 голосов
/ 30 января 2012

Анализ вашей крошечной выборки данных:

>>> s = "\x98cW\x01\xa2\xbb\xba\xcc\xec\x90\xfc\xffP\xcb%\x01\x08"
>>> u = s.decode('utf8', 'replace')
>>> u
u'\ufffdcW\x01\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdP\ufffd%\x01\x08'
>>> u.count(u'\ufffd')
9
>>> len(u)
16

(1) Это определенно не UTF-8 со случайной неверной последовательностью;более 50% символов Unicode недопустимы.Другими словами, нажатие вперед и использование data.decode('utf8', 'replace') НЕ является хорошей идеей (на основе этого примера TINY).

(2) Символы \x01 (дважды) и \x08 заставляют меня подозревать, что выкаким-то образом получили двоичные данные.

(3) Сообщение об ошибке (усеченное), которое вы цитировали в комментарии, упомянуло 0x88, но в примерах данных нет 0x88.

(4) Отредактируйте ваш вопрос, чтобы показать, что вы должны были сделать в начале: (а) минимальный код, необходимый для воспроизведения проблемы, включая URL-адрес, к которому вы обращаетесь (б) полное сообщение об ошибке и трассировку (в) заверениечто вы скопировали / вставили (a) и (b) вместо того, чтобы печатать из памяти

...