Errores con el módulo de mecanizado de Python
Pregunta
Estoy usando el módulo mecanizar
para ejecutar algunas consultas web desde Python. Quiero que mi programa sea resistente a los errores y maneje todo tipo de errores (URL incorrectas, respuestas 403/404) con gracia. Sin embargo, no puedo encontrar en la documentación de Mechanize los errores / excepciones que arroja para varios errores.
Solo lo llamo con:
self.browser = mechanize.Browser()
self.browser.addheaders = [('User-agent', browser_header)]
self.browser.open(query_url)
self.result_page = self.browser.response().read()
¿Cómo puedo saber qué errores / excepciones se pueden lanzar aquí y manejarlos?
Solución
$ perl -0777 -ne'print qq($1) if /__all__ = \[(.*?)\]/s' __init__.py | grep Error
'BrowserStateError',
'ContentTooShortError',
'FormNotFoundError',
'GopherError',
'HTTPDefaultErrorHandler',
'HTTPError',
'HTTPErrorProcessor',
'LinkNotFoundError',
'LoadError',
'ParseError',
'RobotExclusionError',
'URLError',
O:
>>> import mechanize
>>> filter(lambda s: "Error" in s, dir(mechanize))
['BrowserStateError', 'ContentTooShortError', 'FormNotFoundError', 'GopherError'
, 'HTTPDefaultErrorHandler', 'HTTPError', 'HTTPErrorProcessor', 'LinkNotFoundErr
or', 'LoadError', 'ParseError', 'RobotExclusionError', 'URLError']
Otros consejos
Si bien esto se publicó hace mucho tiempo, creo que aún es necesario responder la pregunta correctamente, ya que aparece en los resultados de búsqueda de Google para esta misma pregunta.
Mientras escribo esto, mecanizar ( versión = (0, 1, 11, None, None)) en Python 265 eleva urllib2.HTTPError y el estado http está disponible al detectar esta excepción, por ejemplo:
import urllib2
try:
... br.open("http://www.example.org/invalid-page")
... except urllib2.HTTPError, e:
... print e.code
...
404
Encontré esto en sus documentos:
Una última cosa a tener en cuenta es que hay son algunos desnudos, excepto: declaraciones en el módulo, que son allí para manejar una entrada incorrecta inesperada sin bloquear tu programa. Si esto sucede, es un error en mecanizar, así que por favor envíeme el texto de advertencia.
Entonces supongo que no plantean ninguna excepción. También puede buscar en el código fuente las subclases de excepción y ver cómo se usan.