无论如何,覆盖urllib2.HTTPError或urllib.error.HTTPError并读取响应HTML

Bac*_*kus 72 python urllib urllib2 http-error

我收到"HTTP错误500:内部服务器错误"响应,但我仍然想读取错误HTML中的数据.

使用Python 2.6,我通常使用以下方法获取页面:

import urllib2
url = "http://google.com"
data = urllib2.urlopen(url)
data = data.read()
Run Code Online (Sandbox Code Playgroud)

当尝试在失败的URL上使用它时,我得到异常urllib2.HTTPError:

urllib2.HTTPError: HTTP Error 500: Internal Server Error
Run Code Online (Sandbox Code Playgroud)

如何urllib2在返回内部服务器错误时获取此类错误页面(有或没有)?

请注意,对于Python 3,相应的例外是urllib.error.HTTPError.

Joe*_*way 136

HTTPError 是一个类似文件的对象.你可以捕获它,然后read它的内容.

try:
    resp = urllib2.urlopen(url)
    contents = resp.read()
except urllib2.HTTPError, error:
    contents = error.read()
Run Code Online (Sandbox Code Playgroud)

  • 一旦我们完成了error.read(),error.read()随后返回空字符串.有时这会扰乱其他地方的代码.我们如何礼貌地将错误的内容反馈给其他人? (2认同)
  • 由于底层流是一个http响应,它是不可搜索的,这意味着你不能在它上面调用`seek()`. (2认同)

sbe*_*rry 9

如果你的意思是你想读500的身体:

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

在您的情况下,您不需要构建请求.做就是了

try:
        resp = urllib2.urlopen(url)
        print resp.read()
except urllib2.HTTPError, error:
        print "ERROR: ", error.read()
Run Code Online (Sandbox Code Playgroud)

所以,你不要覆盖urllib2.HTTPError,你只需处理异常.