UnicodeDecodeError в Windows, но не при запуске точно такого же кода на Mac - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь загрузить данные JSON через API. Код выглядит следующим образом:

import urllib.request, ssl, json

context = ssl._create_unverified_context()
rsbURL = "https://rsbuddy.com/exchange/summary.json"
with urllib.request.urlopen(rsbURL, context=context) as url:
    data = json.loads(url.read().decode('UTF-8'))

Этот код прекрасно работает на моем Mac, и я подтвердил, что data - это то, чем он должен быть - строка json. Однако, когда я запускаю точно такой же код в Windows, я получаю эту ошибку:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Что происходит и как это исправить?

1 Ответ

1 голос
/ 22 мая 2019

Похоже, что сервер отправляет сжатый ответ по какой-то причине (он не должен этого делать, если вы явно не установили заголовок accept-encoding).Вы можете адаптировать свой код для работы со сжатыми ответами, например так:

import gzip
import urllib.request, ssl, json

context = ssl._create_unverified_context()
rsbURL = "https://rsbuddy.com/exchange/summary.json"
with urllib.request.urlopen(rsbURL, context=context) as url:
    if url.info().get('Content-Encoding') == 'gzip':
        body = gzip.decompress(url.read())
    else:
        body = url.read()
data = json.loads(body)
...