Переопределение urllib2.HTTPError или urllib.error.HTTPError и чтение HTML-ответа в любом случае

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

Вопрос

Я получаю сообщение "HTTP Error 500:Ответ "Внутренняя ошибка сервера", но я все еще хочу прочитать данные внутри HTML-кода ошибки.

В Python 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), и все это время они возвращают Внутренние ошибки сервера?

Обратите внимание, что в Python 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