Requests: json () plante l'interpréteur avec une erreur JSONDecodeError

Créé le 13 sept. 2017  ·  3Commentaires  ·  Source: psf/requests

J'ai reproduit cela avec les requêtes v. 2.18.4 et 2.14.2, ainsi que Python 3.6.1 et 3.6.2. J'ai utilisé mon Python/requêtes installé sur le système (macOS Sierra avec Python 3.6.1 téléchargé à partir de python.org), Python/requêtes installé dans le cadre de conda 4.3.25, et les derniers Python et requêtes installés à partir de conda-forge.

Mêmes résultats partout.

résultat attendu

Vous devriez voir un dictionnaire de valeurs JSON, comme indiqué ici : http://docs.python-requests.org/en/master/

Résultat actuel

L'interpréteur Python plante.

Étapes de reproduction

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)

Informations système

$ 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
}

Commentaire le plus utile

@justlurking , cela fonctionne réellement comme prévu. La méthode .json() n'est utilisable que sur le contenu de réponse au format json. La page Web que vous demandez renvoie un document HTML et ne fonctionnera donc pas.

Vous devrez soit modifier vos en-têtes Accept et tenter de récupérer des données json valides, soit ajouter du code pour gérer le cas où les données json ne sont pas facilement disponibles. Je ferme ceci car les choses fonctionnent comme prévu.

Tous les 3 commentaires

@justlurking , cela fonctionne réellement comme prévu. La méthode .json() n'est utilisable que sur le contenu de réponse au format json. La page Web que vous demandez renvoie un document HTML et ne fonctionnera donc pas.

Vous devrez soit modifier vos en-têtes Accept et tenter de récupérer des données json valides, soit ajouter du code pour gérer le cas où les données json ne sont pas facilement disponibles. Je ferme ceci car les choses fonctionnent comme prévu.

Merci pour la réponse super rapide et instructive, et excuses pour avoir perdu votre temps. J'aurais dû me rendre compte que cela pourrait être quelque chose comme ça étant donné les multiples versions que j'ai testées et le manque de tollé sur GitHub. ??

J'imagine que la meilleure chose à faire serait d'importer json.JSONDecodeError et de faire quelque chose comme ça?

try:
    r.json()
except JSONDecodeError as e:
    <handle exception>

Donc, cela devrait en fait être une sous-classe de ValueError, donc je pense que vous pourrez l'attraper si vous ne voulez pas importer. C'est à vous de décider du niveau de spécificité que vous souhaitez.

Cette idée générale est l'approche que je suggérerais cependant. J'espère que cela pourra aider!

Cette page vous a été utile?
0 / 5 - 0 notes