Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 3, 2014 08:43:40

westyeast
Зарегистрирован: 2014-01-03
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с decode

Всем привет! При написании парсера столкнулся с такой проблемой

from urllib.request import urlopen
url = 'http://ya.ru/'
data = urlopen(url).read()
print(data.decode('utf-8', errors='ignore'))

Появляется ошибка:
UnicodeEncodeError: ‘charmap’ codec can't encode character ‘\xa9’ in position 6711: character maps to <undefined>

Хотя передается параметр errors='ignore'

Если попробовать декодировать так:
print(b'\xa9SPAM'.decode('utf-8', errors='ignore'))
То никаких ошибок не возникает, и символ ‘\xa9’ вырезается.

В чем может быть причина, что не срабатывает errors='ignore' в первом случае?

Офлайн

#2 Янв. 3, 2014 15:26:40

tibs
От:
Зарегистрирован: 2011-06-30
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблемы с decode

westyeast,

Полагаю, что в юникоде есть какой-то символ, который не может быть выведен в консоль или в файл.

Можно попробовать сделать вывод в кодировке UTF-8 или другой. Например, так:

open('1.txt', 'wb').write(data.decode('utf8', errors='ignore').encode('utf8', errors='ignore'))

В этом случае все будет хорошо.



Отредактировано tibs (Янв. 3, 2014 15:27:04)

Офлайн

#3 Янв. 4, 2014 10:48:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Проблемы с decode

в третьем питоне можно определять кодировку страницы с помощью метода

>>> import urllib.request
>>> data = urllib.request.urlopen('http://python.su')
>>> data.headers.get_content_charset()
'utf-8'
>>>


westyeast
UnicodeEncodeError
это к методу .decode() отношения не имеет

пример
>>> b'\xb8'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte
>>>



Отредактировано py.user.next (Янв. 4, 2014 10:52:52)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version