请求——如何判断你是不是收到 404
Posted
技术标签:
【中文标题】请求——如何判断你是不是收到 404【英文标题】:Requests -- how to tell if you're getting a 404请求——如何判断你是否收到 404 【发布时间】:2013-02-21 21:58:41 【问题描述】:我正在使用 Requests 库并使用以下代码访问网站以从中收集数据:
r = requests.get(url)
我想在输入不正确的 URL 并返回 404 错误时添加错误测试。如果我故意输入一个无效的 URL,当我这样做时:
print r
我明白了:
<Response [404]>
编辑:
我想知道如何测试。对象类型仍然相同。当我执行r.content
或r.text
时,我只是获得了自定义404 页面的html。
【问题讨论】:
看文档:docs.python-requests.org/en/latest首页状态看r.status_code 【参考方案1】:如果您的请求是在另一个函数内部发出的,但您想在更高级别捕获错误,很高兴知道您也可以直接从异常中获取状态码。在我的情况下,我无法访问响应,因为在我的函数能够传递响应之前引发了 HTTPError。我最终做了以下事情:
try:
r = function_calling_request(the_request)
except HTTPError as e:
if e.response.status_code == 404:
return do_stuff_if_not_found()
【讨论】:
【参考方案2】:看r.status_code
attribute:
if r.status_code == 404:
# A 404 was issued.
演示:
>>> import requests
>>> r = requests.get('http://httpbin.org/status/404')
>>> r.status_code
404
如果您希望 requests
针对错误代码(4xx 或 5xx)引发异常,请调用 r.raise_for_status()
:
>>> r = requests.get('http://httpbin.org/status/404')
>>> r.raise_for_status()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "requests/models.py", line 664, in raise_for_status
raise http_error
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND
>>> r = requests.get('http://httpbin.org/status/200')
>>> r.raise_for_status()
>>> # no exception raised.
您还可以在布尔上下文中测试响应对象;如果状态码不是错误码(4xx 或 5xx),则认为是“真”:
if r:
# successful response
如果您想更明确,请使用if r.ok:
。
【讨论】:
该死的,这很烦人。我希望有一种方法可以让 requests.get 以除了 2XX 之外的任何原因加注,而不必进行额外的跟注。 @AsfandQazi:为什么要为 1xx 或 3xx 状态码引发异常?这些不是错误条件。 1xx 和 3xx 应该(并且已经)由库透明地处理。我专门谈论的是 4xx 错误。当然,有时您可能想读取 4xx 响应,因此我们不应该将其强加于所有人,但我希望您可以将标志传递给.get()
,而不是事后调用函数。
@AsfandQazi:如果这对你很重要的话,编写你自己的包装函数是微不足道的。
好像有点乱,仅此而已以上是关于请求——如何判断你是不是收到 404的主要内容,如果未能解决你的问题,请参考以下文章
如何判断服务器上的图片是不是存在(javascript或者jQuery实现)?