ValueError:没有JSON对象可以解码,但是正<Response [200]>

Art*_*uro 3 python url json

我正在浏览一些URL,我可以从我正在使用的API中获取大部分数据.*Imgur API.然而,当它找到之前已经发布但最终被删除的图像时,它仍然显示正向URL获取响应(代码200),当我使用时

    j1 = json.loads(r_positive.text)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

http://imgur.com/gallery/cJPSzbu.json
<Response [200]>
Traceback (most recent call last):
  File "image_poller_multiple.py", line 61, in <module>
    j1 = json.loads(r_positive.text)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Run Code Online (Sandbox Code Playgroud)

我怎样才能"获取"j1变量中的错误呢?我想使用条件结构来解决问题并避免我的程序崩溃.就像是

if j1 == ValueError:
  continue
else:
  do_next_procedures()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

您需要使用try except:

try:
    j1 = json.loads(r_positive.text)
except ValueError:
    # decoding failed
    continue
else:
    do_next_procedures()
Run Code Online (Sandbox Code Playgroud)

请参阅Python教程中的处理异常.

什么真正的情况是,你被重定向该URL,你得到的图像页面,而不是.如果您requests用于获取JSON,请查看响应历史记录:

if r_positive.history:
    # more than one request, we were redirected:
    continue
else:
    j1 = r_positive.json()
Run Code Online (Sandbox Code Playgroud)

或者你甚至可以禁止重定向:

r = requests.post(url, allow_redirects=False)
if r.status == 200:
    j1 = r.json() 
Run Code Online (Sandbox Code Playgroud)

  • 不应该`继续'成为'传递'(Python的noop声明)吗?循环外的`continue`语句是Python 2.7上的SyntaxError(异常处理块不是循环). (2认同)
  • @rsanchezsaez:OP有一个`continue`语句,所以我假设发布的代码片段是循环的更大代码块的一部分. (2认同)