¿Por qué me sale urllib2.HTTPError con urllib2 y no tengo errores con urllib?

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