لماذا أحصل على Urllib2.httperror مع Urllib2 ولا أخطاء مع Urllib؟

StackOverflow https://stackoverflow.com/questions/1482028

  •  18-09-2019
  •  | 
  •  

سؤال

لدي رمز بسيط التالي:

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 على أي حال يوضح هذا المنصب طريقة لطيفة للحصول على رسالة خطأ مفصلة من الخادم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top