【问题标题】: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.contentr.text 时,我只是获得了自定义404 页面的HTML。

【问题讨论】:

标签: python python-requests


【解决方案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:如果这对你很重要的话,编写你自己的包装函数是微不足道的。
    • 好像有点乱,仅此而已
    猜你喜欢
    • 2014-10-10
    • 2014-12-24
    • 2010-10-15
    • 2017-12-12
    • 2021-05-07
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多