Requests: json () trava o interpretador com um JSONDecodeError

Criado em 13 set. 2017  ·  3Comentários  ·  Fonte: psf/requests

Eu reproduzi isso com as solicitações v. 2.18.4 e 2.14.2, junto com Python 3.6.1 e 3.6.2. Usei meu Python / solicitações instaladas pelo sistema (macOS Sierra com Python 3.6.1 baixado de python.org), Python / solicitações instaladas como parte do conda 4.3.25 e o Python / solicitações mais recentes instaladas do conda-forge.

Os mesmos resultados em todos os lugares.

resultado esperado

Esperava-se ver um dicionário de valores JSON, conforme indicado aqui: http://docs.python-requests.org/en/master/

Resultado atual

O interpretador Python trava.

Etapas de reprodução

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)

Informação do 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
}

Comentários muito úteis

Ei @justlurking , isso está funcionando como esperado. O método .json () só pode ser usado no conteúdo de resposta que está no formato json. A página da web que você está solicitando está retornando um documento HTML e, portanto, não funciona.

Você precisará modificar seus cabeçalhos de aceitação e tentar recuperar dados json válidos ou adicionar código para lidar com o caso de dados json não estarem prontamente disponíveis. Estou encerrando isso porque as coisas estão funcionando conforme o esperado.

Todos 3 comentários

Ei @justlurking , isso está funcionando como esperado. O método .json () só pode ser usado no conteúdo de resposta que está no formato json. A página da web que você está solicitando está retornando um documento HTML e, portanto, não funciona.

Você precisará modificar seus cabeçalhos de aceitação e tentar recuperar dados json válidos ou adicionar código para lidar com o caso de dados json não estarem prontamente disponíveis. Estou encerrando isso porque as coisas estão funcionando conforme o esperado.

Obrigado pela resposta super rápida e informativa, e desculpas por desperdiçar seu tempo. Eu deveria ter percebido que poderia ser algo assim, dadas as várias versões que testei e a falta de clamor no GitHub. 🤦

Imagino que a melhor coisa a fazer seria importar json.JSONDecodeError e fazer algo assim?

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

Portanto, esta deve ser na verdade uma subclasse de ValueError, então acho que você poderá pegá-la se não quiser importar. Depende de você o nível de especificidade que deseja.

Essa ideia geral é a abordagem que eu sugiro. Espero que ajude!

Esta página foi útil?
0 / 5 - 0 avaliações