تجاوز Urllib2.httperror أو Urllib.Error.httperror والقراءة استجابة HTML على أي حال

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

سؤال

أتلقى "خطأ HTTP 500: استجابة خطأ الخادم الداخلي، لكن ما زلت أريد قراءة البيانات داخل الخطأ HTML.

مع بيثون 2.6، أرجو عادة صفحة باستخدام:

import urllib2
url = "http://google.com"
data = urllib2.urlopen(url)
data = data.read()

عند محاولة استخدام هذا على عنوان URL الفاشلة، أحصل على الاستثناء urllib2.HTTPError:

urllib2.HTTPError: HTTP Error 500: Internal Server Error

كيف يمكنني جلب صفحات الخطأ هذه (مع أو بدون urllib2)، كل ذلك بينما يعودون أخطاء الخادم الداخلي؟

لاحظ أنه مع بيثون 3، فإن الاستثناء المقابل هو urllib.error.HTTPError.

هل كانت مفيدة؟

المحلول

ال HTTPError هو كائن يشبه الملف. وبعد يمكنك اللحاق به ثم read محتوياته.

try:
    resp = urllib2.urlopen(url)
    contents = resp.read()
except urllib2.HTTPError, error:
    contents = error.read()

نصائح أخرى

إذا كنت تعني أنك تريد قراءة جسم 500:

request = urllib2.Request(url, data, headers)
try:
        resp = urllib2.urlopen(request)
        print resp.read()
except urllib2.HTTPError, error:
        print "ERROR: ", error.read()

في حالتك، لا تحتاج إلى بناء الطلب. فقط تفعل

try:
        resp = urllib2.urlopen(url)
        print resp.read()
except urllib2.HTTPError, error:
        print "ERROR: ", error.read()

لذلك، لا تتجاوز Urllib2.httperror، فأنت تعامل فقط باستثناء الاستثناء.

alist=['http://someurl.com']

def testUrl():
    errList=[]
    for URL in alist:
        try:
            urllib2.urlopen(URL)
        except urllib2.URLError, err:
            (err.reason != 200)
            errList.append(URL+" "+str(err.reason))
            return URL+" "+str(err.reason)
    return "".join(errList)

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