Tengo el siguiente código simple:
import urllib2 import sys sys.path.append('../BeautifulSoup/BeautifulSoup-3.1.0.1') from BeautifulSoup import * page='http://en.wikipedia.org/wiki/Main_Page' c=urllib2.urlopen(page)
Este código genera los siguientes mensajes de error:
c=urllib2.urlopen(page) File "/usr/lib64/python2.4/urllib2.py", line 130, in urlopen return _opener.open(url, data) File "/usr/lib64/python2.4/urllib2.py", line 364, in open response = meth(req, response) File "/usr/lib64/python2.4/urllib2.py", line 471, in http_response response = self.parent.error( File "/usr/lib64/python2.4/urllib2.py", line 402, in error return self._call_chain(*args) File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain result = func(*args) File "/usr/lib64/python2.4/urllib2.py", line 480, in http_error_default raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) urllib2.HTTPError: HTTP Error 403: Forbidden
Pero si reemplazo urllib2 por urllib, no aparece ningún mensaje de error. ¿Alguien puede explicar este comportamiento?
El urllib
original simplemente no urllib
una excepción en un código 403. Si agrega print c.getcode()
a la última línea de su progtwig, urllib
lo alcanzará y seguirá imprimiendo 403.
Luego, si print c.read()
al final, verá que efectivamente obtuvo una página de error de Wikipedia. Es solo una cuestión de que urllib2
decida tratar un error 403 como una excepción de tiempo de ejecución, en urllib
que urllib
permita recibir un error 403 y luego hacer algo con la página.
Wikipedia parece estar filtrando el User-Agent predeterminado de urllib2. Sólo tienes que cambiarlo.
Anulando urllib2.HTTPError o urllib.error.HTTPError y leyendo el HTML de la respuesta de todos modos, esta publicación muestra una buena forma de obtener un mensaje de error detallado del servidor