Requests: json()がJSONDecodeErrorでインタプリタをクラッシュさせる

作成日 2017年09月13日  ·  3コメント  ·  ソース: psf/requests

私はこれをリクエストv。2.18.4と2.14.2、およびPython3.6.1と3.6.2で再現しました。 システムにインストールされたPython / request(python.orgからダウンロードされたPython3.6.1のmacOSSierra)、conda4.3.25の一部としてインストールされたPython / request、およびconda-forgeからインストールされた最新のPythonとリクエストを使用しました。

どこでも同じ結果。

期待される結果

ここに示されているように、JSON値のディクショナリが表示されることが期待されます: http

実結果

Pythonインタープリターがクラッシュします。

複製手順

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
}

最も参考になるコメント

ねえ@justlurking 、これは実際には期待どおりに機能しています。 .json()メソッドは、json形式の応答コンテンツでのみ使用できます。 リクエストしているウェブページはHTMLドキュメントを返しているため、機能しません。

あなたはどちらかあなたの受け入れのヘッダーを変更し、有効なJSONデータを取得しようとし、またはJSONデータが容易に利用可能でない場合を処理するコードを追加する必要があります。 物事が期待どおりに機能しているので、これを閉じます。

全てのコメント3件

ねえ@justlurking 、これは実際には期待どおりに機能しています。 .json()メソッドは、json形式の応答コンテンツでのみ使用できます。 リクエストしているウェブページはHTMLドキュメントを返しているため、機能しません。

あなたはどちらかあなたの受け入れのヘッダーを変更し、有効なJSONデータを取得しようとし、またはJSONデータが容易に利用可能でない場合を処理するコードを追加する必要があります。 物事が期待どおりに機能しているので、これを閉じます。

非常に迅速で有益な返信をありがとう、そしてあなたの時間を無駄にしてしまったことをお詫びします。 私がテストした複数のバージョンとGitHubでの抗議の欠如を考えると、それはそのようなものかもしれないことに気づいたはずです。 🤦

json.JSONDecodeErrorをインポートして、このようなことをするのが最善の方法だと思いますか?

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

したがって、これは実際にはValueErrorのサブクラスである必要があるため、インポートしたくない場合はそれをキャッチできると思います。 あなたが望む特異性のレベルはあなた次第です。

その一般的な考え方は、私が提案するアプローチです。 お役に立てば幸いです。

このページは役に立ちましたか?
0 / 5 - 0 評価