Найти - Пользователи
Полная версия: как правильно декодировать ответ QNetworkreply?
Начало » Python для новичков » как правильно декодировать ответ QNetworkreply?
1
Игнат
скачиваю страницу с помощью 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')
Андрей Светлов
Подсматривайте кодировку в http headers
Игнат
спасибо
но у большинства страниц в хидере Content-type почему-то не указана charset, просто ‘text/html’ и всё

и ещё:
я где-то увидел в чужом коде
buf = self.reply.readAll()
print(buf.data())
Андрей Светлов
По стандарту если не указано - то ISO 8859-1
Впрочем, ложили все на этот стандарт.
Есть либа chardet - для таких некорректных страничек сделана.
Игнат
я пробовал её, но с ней как мне показалось, все стало работать медленнее в разы
больше всего убивает такая каша в ответе:

“ 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

есть какой-то грамотный способ заменить её на спец.символы, или сделать простой заменой?
Игнат
стал по умолчанию декодировать все как ISO-8859-1, вроде помогло
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB