2009-09-26 9 views
6

Ho il seguente codice semplice:Perché ottengo urllib2.HTTPError con urllib2 e nessun errore 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) 

Questo codice genera i seguenti messaggi di errore:

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 

Ma se sostituisco urllib2 da urllib, ricevo messaggi di errore. Qualcuno può spiegare questo comportamento?

risposta

10

L'originale urllib non genera un'eccezione su un codice 403. Se si aggiunge print c.getcode() l'ultima riga del programma, urllib raggiungerà e ancora stampare 403.

Quindi se fate print c.read() alla fine, vedrete che si ha effettivamente ottiene una pagina di errore da Wikipedia. È solo questione di urllib2 decidere di considerare un errore 403 come eccezione di runtime, rispetto a urllib che consente di ottenere ancora un errore 403 e quindi fare qualcosa con la pagina.

4

Wikipedia sembra filtrare l'agente utente predefinito di urllib2. Basta cambiarlo.

+0

link non esiste più – Peter

+1

@Pete E buon viaggio. –

Problemi correlati