即使出现错误,也可以检索HTTPResponse

时间:2012-06-06 14:17:01

标签: python httprequest urllib

在Python中(使用Python 3.2,但我猜它在Python 2.x中应该大致相同),我尝试对某个URL发出请求。

如果出现拒绝访问等错误,我会收到例外情况:

>>> request = urllib.request.urlopen(myurl)
...
  File "/usr/lib/python3.2/urllib/request.py", line 495, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 401: Unauthorized

但即使出现错误,我也希望看到请求的标题。

>>> request = urllib.request.urlopen(myurl)
>>> print(request.status)
401
>>> print(request.headers)
...

我还注意到,当页面回复重定向状态代码(例如301)时,我得到的响应是重定向页面,而不是第一个页面(我想要的那个)。

知道我该怎么做吗?

1 个答案:

答案 0 :(得分:4)

您是否考虑过使用请求包?它会为您提供所有重定向的历史记录,以满足您的要求:

>>> import requests
>>> r = requests.get('http://google.com')
>>> r
<Response [200]>
>>> r.history
[<Response [301]>, <Response [302]>]
>>> r.url
u'http://www.google.co.uk/'

它还可以清楚地处理401错误

>>> r = requests.get('http://sitesurgeon.co.uk/!dev/http-authorisation/staff/index.htm')
>>> r
<Response [401]>
>>> r.content
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> ...
....'
>>> r.headers
{'date': 'Wed, 06 Jun 2012 14:24:16 GMT', 'x-powered-by': 'PHP/5.3.13', 'transfer-encoding': 'chunked', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'Basic realm="Staff Area"', 'server': 'Apache'}

如果您希望控制超时,只需按以下方式提出请求:

requests.get('http://google.com', timeout=0.1)