Żą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.


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:.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.