2010-02-10 13 views
72

Recibo una respuesta 'HTTP Error 500: Internal Server Error', pero aún quiero leer los datos dentro del error HTML.Anulando urllib2.HTTPError o urllib.error.HTTPError y leyendo HTML de todas formas respuesta

con Python 2.6, que normalmente obtener una página usando:

import urllib2 
url = "http://google.com" 
data = urllib2.urlopen(url) 
data = data.read() 

al intentar utilizar esto en la URL en su defecto, consigo la excepción urllib2.HTTPError:

urllib2.HTTPError: HTTP Error 500: Internal Server Error 

¿Cómo puedo ir a buscar tales páginas de error (con o sin urllib2), todo mientras devuelven errores internos del servidor?

Tenga en cuenta que con Python 3, la excepción correspondiente es urllib.error.HTTPError.

Respuesta

135

El HTTPError . Puede capturarlo y luego read su contenido.

try: 
    resp = urllib2.urlopen(url) 
    contents = resp.read() 
except urllib2.HTTPError, error: 
    contents = error.read() 
+2

Una vez que hemos hecho error.read(), error.read() posteriormente devuelve cadena vacía. A veces esto arruina el código en otro lugar. ¿Cómo podemos devolver cortésmente el contenido del error a los demás? –

+1

@Matt Nunca lo he intentado, pero como es un objeto similar a un archivo, es posible que pueda hacer un 'error.seek (0)' para restablecer el "puntero al archivo" al comienzo de la transmisión. No todos los objetos de tipo archivo son necesarios para implementar la parte de acceso aleatorio de la interfaz de E/S, por lo que no estoy seguro de si funciona. Si no es así, podría considerar hacer esta pregunta en su propia pregunta para que pueda acceder a una audiencia más grande. –

+1

Tenga en cuenta que en casos degenerados, HTTPError puede no comportarse como un objeto similar a un archivo. Verifique que read() esté disponible con hasattr. – ron

9

Si quiere decir que desea leer el cuerpo de la 500:

request = urllib2.Request(url, data, headers) 
try: 
     resp = urllib2.urlopen(request) 
     print resp.read() 
except urllib2.HTTPError, error: 
     print "ERROR: ", error.read() 

En su caso, no es necesario para construir la petición. Solo haga

try: 
     resp = urllib2.urlopen(url) 
     print resp.read() 
except urllib2.HTTPError, error: 
     print "ERROR: ", error.read() 

por lo tanto, no invalide urllib2.HTTPError, solo maneje la excepción.

+1

No, quiero leer el código HTML del servidor enviará al navegador del usuario si accidentalmente se fueron a una de las páginas de error 500 internos. Al igual que, si urllib se rompió en cualquier página 404 (no estoy seguro si lo hace, no lo he intentado), quiero leer el html que proporciona la página 404 (por ejemplo, si el sitio tiene una página 404 personalizada). – Backus

-1
alist=['http://someurl.com'] 

def testUrl(): 
    errList=[] 
    for URL in alist: 
     try: 
      urllib2.urlopen(URL) 
     except urllib2.URLError, err: 
      (err.reason != 200) 
      errList.append(URL+" "+str(err.reason)) 
      return URL+" "+str(err.reason) 
    return "".join(errList) 

testUrl() 
+1

binario debe agregar texto descriptivo a su respuesta –

+0

'err.reason' en realidad no proporciona la misma información que' err.read() 'proporciona. Lo posterior puede ser más específicamente útil. –

Cuestiones relacionadas