Żądania - jak sprawdzić, czy otrzymujesz kod 404

148

Korzystam z biblioteki Requests i uzyskuję dostęp do witryny sieci Web, aby zbierać z niej dane za pomocą następującego kodu:

r = requests.get(url)

Chcę dodać testowanie błędów w przypadku wprowadzenia nieprawidłowego adresu URL i zwrócenia błędu 404. Jeśli celowo wprowadzę nieprawidłowy adres URL, kiedy to zrobię:

print r

Rozumiem:

<Response [404]>

EDYTOWAĆ:

Chcę wiedzieć, jak to sprawdzić. Typ obiektu jest nadal ten sam. Kiedy to robię r.contentlub r.text, po prostu otrzymuję kod HTML niestandardowej strony 404.

user1427661
źródło
2
Spójrz na dokumentację: docs.python-requests.org/en/latest Pierwsza strona zawiera informacje na temat r.status_code
Udo Klein

Odpowiedzi:

323

Spójrz na r.status_codeatrybut :

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

Próbny:

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

Jeśli chcesz requestszgłosić wyjątek dla kodów błędów (4xx lub 5xx), zadzwoń 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.

Możesz także przetestować obiekt odpowiedzi w kontekście logicznym; jeśli kod statusu nie jest kodem błędu (4xx lub 5xx), jest uważany za „prawdziwy”:

if r:
    # successful response

Jeśli chcesz być bardziej wyraźny, użyj if r.ok:.

Martijn Pieters
źródło
1
Cholera, to denerwujące. Żałuję, że nie ma sposobu, aby uzyskać request.get podbić z dowolnego powodu, z wyjątkiem 2XX, bez konieczności wykonywania dodatkowych połączeń.
Asfand Qazi
@AsfandQazi: dlaczego chcesz zgłosić wyjątek dla kodu statusu 1xx lub 3xx? To nie są warunki błędu.
Martijn Pieters
2
1xx i 3xx powinny (i są) obsługiwane w sposób przezroczysty przez bibliotekę. Mówiłem konkretnie o błędach 4xx. Oczywiście czasami możesz chcieć przeczytać odpowiedź 4xx, więc nie powinniśmy narzucać jej wszystkim, ale żałuję, że nie ma flagi, do której możesz przejść .get()zamiast później wywoływać funkcję.
Asfand Qazi
@AsfandQazi: napisanie własnej funkcji opakowującej jest trywialne, jeśli jest to dla Ciebie ważne.
Martijn Pieters
1
Po prostu wydaje się trochę nieporządny, to wszystko
Asfand Qazi