重写urllib2.HTTPError或urllib.error.HTTPError并读取响应HTML

72 投票
3 回答
47773 浏览
提问于 2025-04-15 19:05

我收到了一个“HTTP错误500:内部服务器错误”的响应,但我还是想查看错误页面里的数据。

在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

3 个回答

-1

当然可以!请看下面的内容:

这个问题主要是关于如何在代码中处理某些特定的情况。比如,当你在编写程序时,可能会遇到一些错误或者意外的情况,这时候你需要想办法让程序能够继续运行,而不是直接崩溃。

通常,我们会使用一些控制结构,比如“如果...那么...”的语句,来判断程序当前的状态,然后决定接下来该怎么做。这样可以让程序更加灵活,也能提高用户的体验。

另外,处理这些情况时,记录一些日志信息也是很重要的。这样可以帮助你在出现问题时,快速找到原因并解决它。

总之,编写健壮的代码就是要考虑到各种可能出现的情况,并做好相应的处理,这样才能让程序更加稳定。

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()
9

如果你是想读取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,只需处理这个异常就可以了。

136

HTTPError 是一种类似文件的对象。你可以捕捉到它,然后 read 它的内容。

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

撰写回答