代码之家  ›  专栏  ›  技术社区  ›  backus sompnd

重写urlib2.httperror或urlib.error.httperror并读取响应html

  •  72
  • backus sompnd  · 技术社区  · 16 年前

    我收到“HTTP错误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 .

    3 回复  |  直到 9 年前
        1
  •  135
  •   Acsor Łukasz    9 年前

    这个 HTTPError is a file-like object . 你可以抓住它然后 read 它的内容。

    try:
        resp = urllib2.urlopen(url)
        contents = resp.read()
    except urllib2.HTTPError, error:
        contents = error.read()
    
        2
  •  9
  •   sberry    15 年前

    如果你的意思是你想读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()
    

    所以,您不重写urlib2.httperror,只需处理异常。

        3
  •  -1
  •   Tunaki    10 年前
    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()