libreria headers from español python http url urllib

from - urllib request headers python



Cómo atrapar el error 404 en urllib.urlretrieve (3)

Deberías usar:

import urllib2 try: resp = urllib2.urlopen("http://www.google.com/this-gives-a-404/") except urllib2.URLError, e: if not hasattr(e, "code"): raise resp = e print "Gave", resp.code, resp.msg print "=" * 80 print resp.read(80)

Editar: El razonamiento aquí es que a menos que espere un estado excepcional, es una excepción que ocurra, y probablemente ni siquiera lo haya pensado, así que en lugar de dejar que su código continúe ejecutándose mientras no fue exitoso, el el comportamiento predeterminado es, con bastante sensatez, inhibir su ejecución.

Antecedentes: estoy usando urllib.urlretrieve , a diferencia de cualquier otra función en los módulos urllib* , debido al soporte de la función hook (ver reporthook abajo) .. que se usa para mostrar una barra de progreso textual. Esto es Python> = 2.6.

>>> urllib.urlretrieve(url[, filename[, reporthook[, data]]])

Sin embargo, urlretrieve es tan tonto que no deja forma de detectar el estado de la solicitud HTTP (por ejemplo: ¿era 404 o 200?).

>>> fn, h = urllib.urlretrieve(''http://google.com/foo/bar'') >>> h.items() [(''date'', ''Thu, 20 Aug 2009 20:07:40 GMT''), (''expires'', ''-1''), (''content-type'', ''text/html; charset=ISO-8859-1''), (''server'', ''gws''), (''cache-control'', ''private, max-age=0'')] >>> h.status '''' >>>

¿Cuál es la forma más conocida de descargar un archivo HTTP remoto con soporte tipo gancho (para mostrar la barra de progreso) y un manejo adecuado de errores HTTP?


Echa un vistazo al código completo de urllib.urlretrieve :

def urlretrieve(url, filename=None, reporthook=None, data=None): global _urlopener if not _urlopener: _urlopener = FancyURLopener() return _urlopener.retrieve(url, filename, reporthook, data)

En otras palabras, puede usar urllib.FancyURLopener (es parte de la API pública de urllib). Puede anular http_error_default para detectar 404s:

class MyURLopener(urllib.FancyURLopener): def http_error_default(self, url, fp, errcode, errmsg, headers): # handle errors the way you''d like to fn, h = MyURLopener().retrieve(url, reporthook=my_report_hook)