2009-09-26 8 views
6

mam następujący prosty kod:Dlaczego otrzymuję urllib2.HTTPError z urllib2 i bez błędów z 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) 

Ten kod generuje następujące komunikaty o błędach:

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 

Ale jeśli mam wymienić urllib2 przez urllib, otrzymuję żadnych komunikatów o błędach. Czy ktoś może wyjaśnić to zachowanie?

Odpowiedz

10

Oryginalny urllib po prostu nie wywołuje wyjątku na kodzie 403. Jeśli dodać print c.getcode() do ostatniej linii programu, urllib będzie go osiągnąć i jeszcze wydrukować 403.

Następnie, jeśli nie print c.read() na koniec, widać, że rzeczywiście dostać stronę błędu z Wikipedii. Problem polega na tym, że podjecie błędu 403 jako wyjątku w czasie wykonywania, w przeciwieństwie do urllib, dzięki czemu nadal można uzyskać błąd 403, a następnie zrobić coś ze stroną.

4

Wikipedia wydaje się odfiltrowywać domyślny User-Agent użytkownika Urllib2. Po prostu go zmień.

+0

link już nie istnieje – Peter

+1

@Pete and Good Riddance. –