Requests -- 如何判断是否是404错误

242 投票
2 回答
308157 浏览
提问于 2025-04-17 18:11

我正在使用Requests库来访问一个网站,目的是从中获取数据,代码如下:

r = requests.get(url)

我想添加一些错误检测功能,以便在输入不正确的URL时能够处理404错误。如果我故意输入一个无效的URL,当我这样做时:

print r

我得到的是:

<Response [404]>

编辑:

我想知道如何进行这样的测试。对象类型还是一样的。当我使用 r.contentr.text 时,我只是得到了一个自定义404页面的HTML内容。

2 个回答

7

如果你的请求是在另一个函数里面发出的,但你想在更高的层级捕捉到错误,知道你可以直接从异常中获取状态码是很有用的。在我的情况下,由于HTTP错误在我的函数能够传递响应之前就被抛出了,所以我无法访问到响应。最后我做了以下操作:

try:
     r = function_calling_request(the_request)
except HTTPError as e:
     if e.response.status_code == 404:
          return do_stuff_if_not_found()
483

看看这个 r.status_code 属性:

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:

撰写回答