Solicitudes: cómo saber si está obteniendo un 404

139

Estoy usando la biblioteca de Solicitudes y accedo a un sitio web para recopilar datos con el siguiente código:

r = requests.get(url)

Quiero agregar pruebas de error para cuando se ingresa una URL incorrecta y se devuelve un error 404. Si introduzco intencionalmente una URL no válida, cuando hago esto:

print r

Entiendo esto:

<Response [404]>

EDITAR:

Quiero saber cómo probar eso. El tipo de objeto sigue siendo el mismo. Cuando lo hago r.contento r.text, simplemente obtengo el HTML de una página 404 personalizada.

usuario1427661
fuente
2
Mire la documentación: docs.python-requests.org/en/latest La primera página indica mirar r.status_code
Udo Klein

Respuestas:

307

Mira el r.status_codeatributo :

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

Manifestación:

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

Si desea requestsgenerar una excepción para los códigos de error (4xx o 5xx), llame al 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.

También puede probar el objeto de respuesta en un contexto booleano; Si el código de estado no es un código de error (4xx o 5xx), se considera 'verdadero':

if r:
    # successful response

Si quieres ser más explícito, úsalo if r.ok:.

Martijn Pieters
fuente
1
Bueno, maldita sea, eso es molesto. Desearía que hubiera una forma de obtener solicitudes. Obtener para subir por cualquier motivo, excepto un 2XX sin tener que hacer llamadas adicionales.
Asfand Qazi
@AsfandQazi: ¿por qué querría generar una excepción para un código de estado 1xx o 3xx? Esas no son condiciones de error.
Martijn Pieters
2
1xx y 3xx deberían (y son) manejados de manera transparente por la biblioteca. Estaba hablando específicamente sobre errores 4xx. Por supuesto, a veces es posible que desee leer una respuesta 4xx, por lo que no deberíamos imponerla a todos, pero desearía que hubiera una bandera a la que podría pasar en .get()lugar de llamar a una función después.
Asfand Qazi
@AsfandQazi: es trivial escribir su propia función de contenedor si eso es importante para usted.
Martijn Pieters
1
Parece un poco desordenado, eso es todo
Asfand Qazi el