Ich habe dies mit Anfragen v. 2.18.4 und 2.14.2 reproduziert, zusammen mit Python 3.6.1 und 3.6.2. Ich habe mein systeminstalliertes Python/Requests (macOS Sierra mit Python 3.6.1 heruntergeladen von python.org), Python/Requests als Teil von conda 4.3.25 installiert und das neueste Python und Requests von conda-forge installiert.
Überall gleiche Ergebnisse.
Es wird erwartet, dass ein Wörterbuch mit JSON-Werten angezeigt wird, wie hier angegeben: http://docs.python-requests.org/en/master/
Python-Interpreter stürzt ab.
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
}
Hey @justlurking , das funktioniert tatsächlich wie erwartet. Die Methode .json() kann nur für Antwortinhalte verwendet werden, die im json-Format vorliegen. Die von Ihnen angeforderte Webseite gibt ein HTML-Dokument zurück und funktioniert daher nicht.
Sie müssen entweder Ihre Accept-Header ändern und versuchen , gültige Json-Daten abzurufen, oder Code hinzufügen, um den Fall zu behandeln, dass Json-Daten nicht ohne weiteres verfügbar sind. Ich schließe dies, da die Dinge wie erwartet funktionieren.
Vielen Dank für die superschnelle und informative Antwort und entschuldigen Sie, dass Sie Ihre Zeit verschwendet haben. Ich hätte erkennen müssen, dass es angesichts der mehreren von mir getesteten Versionen und des fehlenden Aufschreis auf GitHub so ähnlich sein könnte. 🤦
Ich stelle mir vor, das Beste wäre, json.JSONDecodeError zu importieren und so etwas zu tun?
try:
r.json()
except JSONDecodeError as e:
<handle exception>
Dies sollte also eigentlich eine Unterklasse von ValueError sein, also denke ich, dass Sie das abfangen können, wenn Sie nicht importieren möchten. Es liegt an Ihnen, welche Spezifität Sie möchten.
Diese allgemeine Idee ist der Ansatz, den ich jedoch vorschlagen würde. Ich hoffe, das hilft!
Hilfreichster Kommentar
Hey @justlurking , das funktioniert tatsächlich wie erwartet. Die Methode .json() kann nur für Antwortinhalte verwendet werden, die im json-Format vorliegen. Die von Ihnen angeforderte Webseite gibt ein HTML-Dokument zurück und funktioniert daher nicht.
Sie müssen entweder Ihre Accept-Header ändern und versuchen , gültige Json-Daten abzurufen, oder Code hinzufügen, um den Fall zu behandeln, dass Json-Daten nicht ohne weiteres verfügbar sind. Ich schließe dies, da die Dinge wie erwartet funktionieren.