2009-09-26 11 views
6

Tengo el siguiente código simple:¿Por qué obtengo urllib2.HTTPError con urllib2 y no hay errores con urllib?

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 mensajes de error siguientes:

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, recibo ningún mensaje de error. ¿Alguien puede explicar este comportamiento?

Respuesta

10

El urllib original simplemente no genera una excepción en un código 403. Si se agrega print c.getcode() a la última línea del programa, urllib llegarán a él y todavía imprimir 403.

Entonces si lo hace print c.read() al final, verá que, efectivamente, obtener una página de error de Wikipedia. Es solo una cuestión de urllib2 decidir tratar un error 403 como una excepción de tiempo de ejecución, frente a urllib, lo que le permite obtener un error 403 y luego hacer algo con la página.

4

Wikipedia parece estar filtrando el user-agent predeterminado de urllib2. Solo cámbialo.

+0

Enlace ya no existe – Peter

+1

@Pete Y en buena hora. –

Cuestiones relacionadas