Python urllib2: ¿leer el cuerpo del contenido incluso durante la excepción HTTPError?

76

Estoy usando urllib2 para obtener una página a través de HTTP. A veces, el recurso arroja un error HTTP 400 (solicitud incorrecta) cuando mi solicitud contiene un error. Sin embargo, esa respuesta también contiene un elemento XML que proporciona un mensaje de error detallado. Sería muy útil poder ver ese error en lugar de solo la excepción HTTPError devuelta por urllib2.

¿Cómo devuelvo el contenido del documento a pesar de la excepción?

Jamieb
fuente

Respuestas:

53

Puede tratar el error como una respuesta.

http://www.voidspace.org.uk/python/articles/urllib2.shtml#httperror

Cuando se genera un error, el servidor responde devolviendo un código de error HTTP y una página de error. Puede utilizar la instancia HTTPError como respuesta en la página devuelta. Esto significa que además del atributo de código, también tiene métodos read, geturl e info.

Gareth Simpson
fuente
87
import urllib2
try:
    request = urllib2.Request('http://www.somesite.com')
    response = urllib2.urlopen(req)
except urllib2.HTTPError as e:
    error_message = e.read()
    print error_message
Tendayi Mawushe
fuente
0

Puede readel mensaje de respuesta de la excepción HTTPError.

Ejemplo de Python3

import urllib.request

try:
    request = urllib.request.Request('http://httpstat.us/418', headers={'Accept': 'text/plain', 'User-Agent': ''})
    with urllib.request.urlopen(request) as page:
        print('success: ' + page.read().decode())
except urllib.error.HTTPError as httpError:
        error = httpError.read().decode()
        print('error: ' + error)
Sincronizar
fuente