Saya telah mereproduksi ini dengan permintaan v. 2.18.4 dan 2.14.2, bersama dengan Python 3.6.1 dan 3.6.2. Saya telah menggunakan Python/permintaan yang diinstal sistem saya (macOS Sierra dengan Python 3.6.1 diunduh dari python.org), Python/permintaan diinstal sebagai bagian dari conda 4.3.25, dan Python dan permintaan terbaru diinstal dari conda-forge.
Hasil yang sama di mana-mana.
Diharapkan untuk melihat kamus nilai JSON, seperti yang ditunjukkan di sini: http://docs.python-requests.org/en/master/
Penerjemah Python lumpuh.
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
}
Hei @justlurking , ini sebenarnya berfungsi seperti yang diharapkan. Metode .json() hanya dapat digunakan pada konten Respons yang dalam format json. Halaman web yang Anda minta mengembalikan dokumen HTML dan karenanya tidak akan berfungsi.
Anda harus memodifikasi header Terima dan mencoba mengambil data json yang valid, atau menambahkan kode untuk menangani kasus data json tidak tersedia. Saya menutup ini karena semuanya berfungsi seperti yang diharapkan.
Terima kasih atas jawaban yang sangat cepat dan informatif, dan maaf telah membuang waktu Anda. Saya seharusnya menyadari itu mungkin seperti itu mengingat beberapa versi yang saya uji dan kurangnya protes di GitHub. 🤦
Saya membayangkan hal terbaik yang harus dilakukan adalah mengimpor json.JSONDecodeError dan melakukan sesuatu seperti ini?
try:
r.json()
except JSONDecodeError as e:
<handle exception>
Jadi ini sebenarnya adalah subkelas dari ValueError jadi saya pikir Anda akan dapat menangkapnya jika Anda tidak ingin mengimpor. Terserah Anda pada tingkat kekhususan yang Anda inginkan.
Ide umum itu adalah pendekatan yang saya sarankan. Semoga membantu!
Komentar yang paling membantu
Hei @justlurking , ini sebenarnya berfungsi seperti yang diharapkan. Metode .json() hanya dapat digunakan pada konten Respons yang dalam format json. Halaman web yang Anda minta mengembalikan dokumen HTML dan karenanya tidak akan berfungsi.
Anda harus memodifikasi header Terima dan mencoba mengambil data json yang valid, atau menambahkan kode untuk menangani kasus data json tidak tersedia. Saya menutup ini karena semuanya berfungsi seperti yang diharapkan.