3

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

    j1 = json.loads(r_positive.text)

我收到此错误:

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

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

if j1 == ValueError:
  continue
else:
  do_next_procedures()
4

2 回答 2

6

您需要try except改用:

try:
    j1 = json.loads(r_positive.text)
except ValueError:
    # decoding failed
    continue
else:
    do_next_procedures()

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

真正发生的是,您被重定向到该 URL,而您获得的是图像页面。如果您requests用于获取 JSON,请查看响应历史记录

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

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

r = requests.post(url, allow_redirects=False)
if r.status == 200:
    j1 = r.json() 
于 2013-04-08T15:42:51.333 回答
1

您列出的 URL 会将您重定向到 HTML 页面。(curl用来检查这样的事情,他是你的朋友。)

HTML 页面显然不能解析为 JSON。

你可能需要的是:

response = fetch_the_url(url)
if response.status == 200:
  try:
    j1 = json.loads(response.text)
  except ValueError:
    # json can't be parsed
    continue
于 2013-04-08T15:45:01.543 回答