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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.