リクエスト— 404を取得しているかどうかを確認する方法


139

リクエストライブラリを使用して、次のコードでWebサイトにアクセスし、そこからデータを収集しています。

r = requests.get(url)

不適切なURLが入力され、404エラーが返された場合のエラーテストを追加したいと思います。意図的に無効なURLを入力した場合、これを行うと次のようになります。

print r

私はこれを手に入れます:

<Response [404]>

編集:

それをテストする方法を知りたいです。オブジェクトタイプは同じです。r.contentまたはを実行するr.textと、カスタム404ページのHTMLを取得するだけです。


2
ドキュメントをご覧ください:docs.python-requests.org/en/latest最初のページには、r.status_codeを確認するように記載されています
Udo Klein

回答:


307

r.status_code属性を見てください:

if r.status_code == 404:
    # A 404 was issued.

デモ:

>>> import requests
>>> r = requests.get('http://httpbin.org/status/404')
>>> r.status_code
404

requestsエラーコード(4xxまたは5xx)の例外を発生させたい場合は、次を呼び出しますr.raise_for_status()

>>> r = requests.get('http://httpbin.org/status/404')
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "requests/models.py", line 664, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND
>>> r = requests.get('http://httpbin.org/status/200')
>>> r.raise_for_status()
>>> # no exception raised.

ブール値のコンテキストで応答オブジェクトをテストすることもできます。ステータスコードがエラーコード(4xxまたは5xx)ではない場合、「true」と見なされます。

if r:
    # successful response

より明確にしたい場合は、を使用してくださいif r.ok:


1
まあ、いまいましいです。余分な呼び出しをせずに、2XX以外の理由でrequests.getを発生させる方法があったらいいのにと思います。
Asfand Qazi

@AsfandQazi:なぜ1xxまたは3xxステータスコードの例外を発生させたいのですか?これらはエラー状態ではありません。
Martijn Pieters

2
1xxおよび3xxは、ライブラリによって透過的に処理される必要があります(処理されます)。私は特に4xxエラーについて話していました。もちろん、4xxの応答を読みたい場合もあるので、誰にもそれを課すべきではありませんが、.get()後で関数を呼び出す代わりに渡せるフラグがあればいいのにと思います。
Asfand Qazi

@AsfandQazi:自分にとって重要なラッパー関数を作成するのは簡単です。
Martijn Pieters

1
それは少し
だらし
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.