Demandes - comment savoir si vous obtenez un 404

139

J'utilise la bibliothèque Requests et j'accède à un site Web pour en recueillir des données avec le code suivant:

r = requests.get(url)

Je souhaite ajouter un test d'erreur lorsqu'une URL incorrecte est saisie et qu'une erreur 404 est renvoyée. Si j'entre intentionnellement une URL invalide, lorsque je fais cela:

print r

J'ai compris:

<Response [404]>

ÉDITER:

Je veux savoir comment tester cela. Le type d'objet est toujours le même. Lorsque je fais r.contentou r.text, j'obtiens simplement le HTML d'une page 404 personnalisée.

user1427661
la source
2
Consultez la documentation: docs.python-requests.org/en/latest La première page indique de regarder r.status_code
Udo Klein

Réponses:

308

Regardez l' r.status_codeattribut :

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

Démo:

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

Si vous souhaitez requestslever une exception pour les codes d'erreur (4xx ou 5xx), appelez 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.

Vous pouvez également tester l'objet de réponse dans un contexte booléen; si le code d'état n'est pas un code d'erreur (4xx ou 5xx), il est considéré comme `` vrai '':

if r:
    # successful response

Si vous voulez être plus explicite, utilisez if r.ok:.

Martijn Pieters
la source
1
Bon sang, c'est ennuyeux. J'aurais aimé qu'il y ait un moyen d'obtenir des requêtes.get à lever pour une raison quelconque sauf un 2XX sans avoir à faire d'appels supplémentaires.
Asfand Qazi
@AsfandQazi: pourquoi voudriez-vous lever une exception pour un code d'état 1xx ou 3xx? Ce ne sont pas des conditions d'erreur.
Martijn Pieters
2
1xx et 3xx doivent (et sont) gérés de manière transparente par la bibliothèque. Je parlais spécifiquement des erreurs 4xx. Bien sûr, parfois, vous voudrez peut-être lire une réponse 4xx donc nous ne devrions pas l'imposer à tout le monde, mais j'aimerais qu'il y ait un drapeau auquel vous pourriez passer au .get()lieu d'appeler une fonction par la suite.
Asfand Qazi
@AsfandQazi: il est trivial d'écrire votre propre fonction wrapper si c'est important pour vous.
Martijn Pieters
1
Cela semble juste un peu désordonné, c'est tout
Asfand Qazi