Уведомления

Группа в Telegram: @pythonsu

#1 Март 12, 2011 14:09:42

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно декодировать ответ QNetworkreply?

скачиваю страницу с помощью Qnetworkaccessmanager
не знаю как правильно её декодировать, при том что кодировки у страниц бывают самые разные
почему-то курл или urllib сами все декодируют, а нетворменеджеру нужны эти костыли

пока слепил вот что:

        QtCore.QObject.connect(self.reply, QtCore.SIGNAL("finished()"),  self.loop.quit);
self.loop.exec()
buf = self.reply.readAll()
try:
self.last_response = bytearray(buf).decode('utf8')
except UnicodeDecodeError:
try:
self.last_response = bytearray(buf).decode('cp1251')
except:
self.last_response = bytearray(buf)
но все равно иногда вылетают ошибки:

  File "C:\Users\Администратор\Desktop\goo\engine\http.py", line 192, in _reque 
t
f.write('URL' + url + "\n\n" + self.last_response)
File "C:\Python32\lib\encodings\cp1251.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\xe1' in position 9
342: character maps to
при том, что парсится google, который на линуксе тем же скриптом парсится нормально

как правильно декодировать не зная кодировки?
bytearray(buf).decode('cp1251')



Офлайн

#2 Март 12, 2011 15:15:12

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

как правильно декодировать ответ QNetworkreply?

Подсматривайте кодировку в http headers



Офлайн

#3 Март 12, 2011 16:51:45

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно декодировать ответ QNetworkreply?

спасибо
но у большинства страниц в хидере Content-type почему-то не указана charset, просто ‘text/html’ и всё

и ещё:
я где-то увидел в чужом коде

buf = self.reply.readAll()
print(buf.data())



Отредактировано (Март 12, 2011 16:57:54)

Офлайн

#4 Март 12, 2011 17:04:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

как правильно декодировать ответ QNetworkreply?

По стандарту если не указано - то ISO 8859-1
Впрочем, ложили все на этот стандарт.
Есть либа chardet - для таких некорректных страничек сделана.



Офлайн

#5 Март 13, 2011 07:55:21

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно декодировать ответ QNetworkreply?

я пробовал её, но с ней как мне показалось, все стало работать медленнее в разы
больше всего убивает такая каша в ответе:

“ border=”0“ />\r\n</TD>\r\n<TD background=”/files/images/pc_tile1a.jpg“>\r\n<IMG height=”63“ alt=”Privy Council Office“ src=”/files/images/pc_title.gif“ width=”237“ border=”0" />\r\n</TD>\r\n</TR>\r\n<TR>\r\n<TD a

есть какой-то грамотный способ заменить её на спец.символы, или сделать простой заменой?



Офлайн

#6 Март 15, 2011 10:00:30

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

как правильно декодировать ответ QNetworkreply?

стал по умолчанию декодировать все как ISO-8859-1, вроде помогло



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version