Anfragen - wie Sie feststellen können, ob Sie einen 404 erhalten


139

Ich verwende die Anforderungsbibliothek und greife auf eine Website zu, um Daten mit dem folgenden Code zu sammeln:

r = requests.get(url)

Ich möchte Fehlertests hinzufügen, wenn eine falsche URL eingegeben und ein 404-Fehler zurückgegeben wird. Wenn ich absichtlich eine ungültige URL eingebe, wenn ich dies tue:

print r

Ich verstehe das:

<Response [404]>

BEARBEITEN:

Ich möchte wissen, wie man das testet. Der Objekttyp ist immer noch der gleiche. Wenn ich r.contentoder tue r.text, bekomme ich einfach den HTML-Code einer benutzerdefinierten 404-Seite.


2
Schauen Sie sich die Dokumentation an: docs.python-requests.org/en/latest Auf der ersten Seite wird angegeben, dass r.status_code
Udo Klein am

Antworten:


307

Schauen Sie sich das r.status_codeAttribut an :

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

Demo:

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

Wenn Sie requestseine Ausnahme für Fehlercodes (4xx oder 5xx) auslösen möchten , rufen Sie auf 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.

Sie können das Antwortobjekt auch in einem booleschen Kontext testen. Wenn der Statuscode kein Fehlercode ist (4xx oder 5xx), wird er als "wahr" betrachtet:

if r:
    # successful response

Wenn Sie expliziter sein möchten, verwenden Sie if r.ok:.


1
Verdammt, das ist nervig. Ich wünschte, es gäbe eine Möglichkeit, Anfragen zu erhalten, die aus irgendeinem Grund außer einem 2XX ausgelöst werden könnten, ohne zusätzliche Anrufe tätigen zu müssen.
Asfand Qazi

@AsfandQazi: Warum sollten Sie eine Ausnahme für einen 1xx- oder 3xx-Statuscode auslösen? Dies sind keine Fehlerbedingungen.
Martijn Pieters

2
1xx und 3xx sollten (und werden) von der Bibliothek transparent behandelt. Ich habe speziell über 4xx-Fehler gesprochen. Natürlich möchten Sie manchmal eine 4xx-Antwort lesen, damit wir sie nicht jedem auferlegen, aber ich wünschte, es gäbe ein Flag, an das Sie übergeben könnten, .get()anstatt anschließend eine Funktion aufzurufen.
Asfand Qazi

@AsfandQazi: Es ist trivial, eine eigene Wrapper-Funktion zu schreiben, wenn dies für Sie wichtig ist.
Martijn Pieters

1
Es scheint nur ein bisschen unordentlich, das ist alles
Asfand Qazi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.