Richieste - come sapere se stai ricevendo un 404


139

Sto utilizzando la libreria Richieste e accedo a un sito Web per raccogliere dati da esso con il seguente codice:

r = requests.get(url)

Voglio aggiungere test di errore per quando viene inserito un URL non corretto e viene restituito un errore 404. Se inserisco intenzionalmente un URL non valido, quando lo faccio:

print r

Capisco questo:

<Response [404]>

MODIFICARE:

Voglio sapere come testarlo. Il tipo di oggetto è sempre lo stesso. Quando lo faccio r.contento r.text, ottengo semplicemente l'HTML di una pagina 404 personalizzata.


2
Guarda la documentazione: docs.python-requests.org/en/latest La prima pagina afferma di guardare r.status_code
Udo Klein

Risposte:


307

Guarda l' r.status_codeattributo :

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

demo:

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

Se si desidera requestssollevare un'eccezione per i codici di errore (4xx o 5xx), chiamare 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.

Puoi anche testare l'oggetto response in un contesto booleano; se il codice di stato non è un codice di errore (4xx o 5xx), è considerato "vero":

if r:
    # successful response

Se vuoi essere più esplicito, usa if r.ok:.


1
Beh dannazione è fastidioso. Vorrei che ci fosse un modo per ottenere richieste. Per rilanciare per qualsiasi motivo tranne un 2XX senza dover effettuare chiamate extra.
Asfand Qazi,

@AsfandQazi: perché dovresti sollevare un'eccezione per un codice di stato 1xx o 3xx? Quelle non sono condizioni di errore.
Martijn Pieters

2
1xx e 3xx dovrebbero (e sono) gestiti in modo trasparente dalla libreria. Stavo parlando specificamente di errori 4xx. Ovviamente a volte potresti voler leggere una risposta 4xx, quindi non dovremmo imporla a tutti, ma vorrei che ci fosse una bandiera a cui potresti passare .get()invece di chiamare una funzione in seguito.
Asfand Qazi,

@AsfandQazi: è banale scrivere la propria funzione wrapper se questo è importante per te.
Martijn Pieters

1
Sembra un po 'disordinato, tutto qui
Asfand Qazi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.