Requests: json () bloquea el intérprete con un JSONDecodeError

Creado en 13 sept. 2017  ·  3Comentarios  ·  Fuente: psf/requests

He reproducido esto con las solicitudes v. 2.18.4 y 2.14.2, junto con Python 3.6.1 y 3.6.2. He utilizado las solicitudes / Python instaladas en mi sistema (macOS Sierra con Python 3.6.1 descargado de python.org), las solicitudes / Python instaladas como parte de conda 4.3.25 y la última versión de Python y las solicitudes instaladas desde conda-forge.

Mismos resultados en todas partes.

Resultado Esperado

Se esperaba ver un diccionario de valores JSON, como se indica aquí: http://docs.python-requests.org/en/master/

Resultado actual

El intérprete de Python se bloquea.

Pasos de reproducción

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)

Información del sistema

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

Comentario más útil

Hola @justlurking , esto en realidad está funcionando como se esperaba. El método .json () solo se puede usar en el contenido de Respuesta que está en formato json. La página web que está solicitando devuelve un documento HTML y, por lo tanto, no funcionará.

Deberá modificar sus encabezados Accept e intentar recuperar datos json válidos, o agregar código para manejar el caso de que los datos json no estén disponibles. Estoy cerrando esto porque las cosas están funcionando como se esperaba.

Todos 3 comentarios

Hola @justlurking , esto en realidad está funcionando como se esperaba. El método .json () solo se puede usar en el contenido de Respuesta que está en formato json. La página web que está solicitando devuelve un documento HTML y, por lo tanto, no funcionará.

Deberá modificar sus encabezados Accept e intentar recuperar datos json válidos, o agregar código para manejar el caso de que los datos json no estén disponibles. Estoy cerrando esto porque las cosas están funcionando como se esperaba.

Gracias por la respuesta súper rápida e informativa, y disculpas por perder tu tiempo. Debería haberme dado cuenta de que podría ser algo así dadas las múltiples versiones que probé y la falta de protesta en GitHub. 🤦

Me imagino que lo mejor que se puede hacer sería importar json.JSONDecodeError y hacer algo como esto.

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

Entonces, esto debería ser una subclase de ValueError, así que creo que podrá detectarlo si no desea importar. Depende de usted el nivel de especificidad que desee.

Sin embargo, esa idea general es el enfoque que sugeriría. ¡Espero que ayude!

¿Fue útil esta página
0 / 5 - 0 calificaciones