2009-09-26 60 views
6

Tôi có đoạn code đơn giản sau đây:Tại sao tôi nhận được urllib2.HTTPError với urllib2 và không có lỗi với 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) 

Mã này tạo ra các thông báo lỗi sau:

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 

Nhưng nếu tôi thay urllib2 bởi urllib, tôi không nhận được thông báo lỗi. Ai có thể giải thích hành vi này?

Trả lời

10

Bản gốc urllib chỉ đơn giản là không tăng ngoại lệ trên mã 403. Nếu bạn thêm print c.getcode() vào dòng cuối cùng của chương trình, urllib sẽ tiếp cận và vẫn in 403.

Sau đó, nếu bạn thực hiện print c.read() ở cuối, bạn sẽ thấy rằng bạn đã thực sự nhận được một trang lỗi từ Wikipedia. Nó chỉ là vấn đề của urllib2 quyết định xử lý lỗi 403 dưới dạng ngoại lệ thời gian chạy, so với urllib cho phép bạn vẫn gặp lỗi 403 và sau đó thực hiện điều gì đó với trang.

4

Wikipedia dường như đang lọc ra User-Agent mặc định của urllib2. Chỉ cần thay đổi nó.

+0

liên kết không còn tồn tại – Peter

+1

@Pete Và tốt sự tự do. –

Các vấn đề liên quan