Я воспроизвел это с запросами v. 2.18.4 и 2.14.2, а также с Python 3.6.1 и 3.6.2. Я использовал установленный в системе Python / requests (macOS Sierra с Python 3.6.1, загруженный с python.org), Python / requests, установленный как часть conda 4.3.25, а также последний Python и запросы, установленные из conda-forge.
Результаты везде одинаковые.
Ожидается увидеть словарь значений JSON, как указано здесь: http://docs.python-requests.org/en/master/
Интерпретатор Python аварийно завершает работу.
Python 3.6.2 | packaged by conda-forge | (default, Jul 23 2017, 23:01:38)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('https://pypi.python.org/pypi')
>>> r.status_code
200
>>> r.encoding
'utf-8'
>>> r.json()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/site-packages/requests/models.py", line 892, in json
return complexjson.loads(self.text, **kwargs)
File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/Users/psimpson/miniconda3/envs/test/lib/python3.6/json/decoder.py", line 357, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
$ python -m requests.help
{
"chardet": {
"version": "3.0.4"
},
"cryptography": {
"version": "2.0.3"
},
"idna": {
"version": ""
},
"implementation": {
"name": "CPython",
"version": "3.6.2"
},
"platform": {
"release": "16.7.0",
"system": "Darwin"
},
"pyOpenSSL": {
"openssl_version": "100020cf",
"version": "17.2.0"
},
"requests": {
"version": "2.18.4"
},
"system_ssl": {
"version": "100020cf"
},
"urllib3": {
"version": "1.22"
},
"using_pyopenssl": true
}
Привет, @justlurking , это действительно работает, как ожидалось. Метод .json () можно использовать только для содержимого ответа в формате json. Запрашиваемая веб-страница возвращает HTML-документ и поэтому не будет работать.
Вам нужно будет либо изменить заголовки Accept и попытаться получить действительные данные json, либо добавить код для обработки случая, когда данные json недоступны. Я закрываю это, потому что все работает, как ожидалось.
Спасибо за супербыстрый и информативный ответ и приносим свои извинения за потраченное время. Я должен был понять, что это может быть что-то подобное, учитывая несколько версий, которые я тестировал, и отсутствие возражений на GitHub. 🤦
Я полагаю, что лучше всего было бы импортировать json.JSONDecodeError и сделать что-то вроде этого?
try:
r.json()
except JSONDecodeError as e:
<handle exception>
Так что на самом деле это должен быть подкласс ValueError, поэтому я думаю, вы сможете это уловить, если не хотите импортировать. Это зависит от вас, на каком уровне конкретности вы хотите.
Я бы предложил эту общую идею. Надеюсь, это поможет!
Самый полезный комментарий
Привет, @justlurking , это действительно работает, как ожидалось. Метод .json () можно использовать только для содержимого ответа в формате json. Запрашиваемая веб-страница возвращает HTML-документ и поэтому не будет работать.
Вам нужно будет либо изменить заголовки Accept и попытаться получить действительные данные json, либо добавить код для обработки случая, когда данные json недоступны. Я закрываю это, потому что все работает, как ожидалось.