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

3 minutos de lectura

avatar de usuario
usuario1427661

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

r = requests.get(url)

Quiero agregar una prueba de error para cuando se ingresa una URL incorrecta y se devuelve un error 404. Si ingreso 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.content o r.textsimplemente obtengo el HTML de una página 404 personalizada.

avatar de usuario
Martijn Pieters

mira el r.status_code atributo:

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 tu quieres requests para generar una excepción para los códigos de error (4xx o 5xx), llame 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, usa if r.ok:.

  • Bueno, maldita sea, eso es molesto. Desearía que hubiera una manera de obtener solicitudes. Conseguir recaudar por cualquier motivo, excepto 2XX, sin tener que hacer llamadas adicionales.

    -Asfand Qazi

    31 de enero de 2019 a las 12:12

  • @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

    31 de enero de 2019 a las 12:26


  • 1xx y 3xx deben (y son) manejados de manera transparente por la biblioteca. Estaba hablando específicamente de errores 4xx. Por supuesto, a veces es posible que desee leer una respuesta 4xx, por lo que no deberíamos imponérsela a todos, pero desearía que hubiera una bandera que pudiera pasar a .get() en lugar de llamar a una función después.

    -Asfand Qazi

    31 de enero de 2019 a las 12:44

  • @AsfandQazi: es trivial escribir su propia función de contenedor si eso es importante para usted.

    – Martijn Pieters

    31 de enero de 2019 a las 12:45

  • Parece un poco desordenado, eso es todo.

    -Asfand Qazi

    31 de enero de 2019 a las 14:40

Si su solicitud se realiza dentro de otra función, pero desea detectar el error en un nivel superior, es bueno saber que también puede obtener el código de estado directamente de la excepción. En mi caso, no pude acceder a la respuesta ya que se generó HTTPError antes de que mi función pudiera transmitir la respuesta. Terminé haciendo lo siguiente:

try:
     r = function_calling_request(the_request)
except HTTPError as e:
     if e.response.status_code == 404:
          return do_stuff_if_not_found()

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad