لماذا أحصل على Urllib2.httperror مع Urllib2 ولا أخطاء مع 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)
يولد هذا الرمز رسائل الخطأ التالية:
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
ولكن إذا قمت باستبدال Urllib2 بواسطة Urllib، فلن أحصل على رسائل خطأ. هل يمكن لأي شخص شرح هذا السلوك؟
المحلول
الأصلي urllib
ببساطة لا يثير استثناء على رمز 403. اذا اضفت print c.getcode()
إلى السطر الأخير من البرنامج الخاص بك، urllib
سوف تصل إليها ولا تزال طباعة 403.
ثم إذا كنت تفعل print c.read()
في النهاية، سترى أنك قمت بالفعل بالحصول على صفحة خطأ من Wikipedia. انها مجرد مسألة urllib2
نقرر علاج خطأ 403 كاستثناء وقت التشغيل، مقابل urllib
مما يتيح لك أن تظل خطأ 403 ثم افعل شيئا مع الصفحة.
نصائح أخرى
يبدو أن Wikipedia تصفية وكيل المستخدم الافتراضي ل URLLIB2. فقط تغييره.
تجاوز Urllib2.httperror أو Urllib.Error.httperror والقراءة استجابة HTML على أي حال يوضح هذا المنصب طريقة لطيفة للحصول على رسالة خطأ مفصلة من الخادم