2009-12-22 32 views
16
import urllib 

print urllib.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read() 

Kịch bản trên hoạt động và trả về kết quả mong đợi khi:urllib2.urlopen() vs urllib.urlopen() - urllib2 ném 404 trong khi urllib hoạt động! TẠI SAO?

import urllib2 

print urllib2.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read() 

ném các lỗi sau:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.5/urllib2.py", line 124, in urlopen 
    return _opener.open(url, data) 
    File "/usr/lib/python2.5/urllib2.py", line 387, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.5/urllib2.py", line 498, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.5/urllib2.py", line 425, in error 
    return self._call_chain(*args) 
    File "/usr/lib/python2.5/urllib2.py", line 360, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.5/urllib2.py", line 506, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 404: Not Found 

Có ai biết tại sao điều này là gì? Tôi đang chạy này từ máy tính xách tay trên mạng gia đình của tôi không có cài đặt proxy - chỉ cần trực tiếp từ máy tính xách tay của tôi đến router sau đó đến www.

Trả lời

35

URL đó thực sự dẫn đến 404, nhưng có nhiều nội dung HTML. urllib2 đang xử lý nó (chính xác) như một điều kiện lỗi. Bạn có thể khôi phục nội dung của trang 404 của trang web đó như vậy:

import urllib2 
try: 
    print urllib2.urlopen('http://www.reefgeek.com/equipment/Controllers_&_Monitors/Neptune_Systems_AquaController/Apex_Controller_&_Accessories/').read() 
except urllib2.HTTPError, e: 
    print e.code 
    print e.msg 
    print e.headers 
    print e.fp.read() 
+2

thật tuyệt khi biết, khi tôi nhập URL này vào trình duyệt của mình, nó cũng hoạt động. Điều này có nghĩa là trình duyệt cũng nhận được 404 nhưng chỉ hiển thị nội dung như urllib không? –

+1

@ Jerry Vâng, đó là ý nghĩa của điều này. Bạn có thể xác minh điều này bằng Trình kiểm tra trang web của Firebug hoặc Safari/Chrome. –

+0

Tôi có firebug và tôi đã kiểm tra nó, nhưng tôi không thấy bất cứ điều gì chỉ ra một 404 - có điều gì đó đặc biệt bạn phải làm gì? Ngoài sự tò mò, tại sao các trình duyệt chịu đựng các tiêu chuẩn nghèo nàn như vậy? Tại sao không chỉ ra rằng nó không thể tìm thấy tập tin? Đây có phải là một loại mẹo mà trang web mà nó sử dụng để ngăn chặn bot hay không - trả lại 404 có nội dung biết rằng trình duyệt sẽ hiển thị nội dung và hầu hết các chương trình sẽ chuyển sang? –

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