为什么我得到一个(貌似)正确拆分字符串的IndexError?

zch*_*zch 1 python indexing split urllib2

我目前有一个脚本应该获取并返回Bit.ly链接的点击次数.我从收集和读取Bitly url中的数据开始,我似乎正确地做了.

    bitly_data = "https://api-ssl.bitly.com/v3/link/clicks?access_token=ACCESS_TOKEN&link=http://bit.ly/"+link
    src = urllib2.urlopen(bitly_data)
    src = src.read()
Run Code Online (Sandbox Code Playgroud)

何时link是这样的东西TY8lnd,src是一个看起来像的字符串

{"status_code":200,"data":{"units": - 1,"tz_offset": - 4,"unit":"day","link_clicks":535},"status_txt":"OK"}

我现在想要解析这个字符串以获得之后的数值link_clicks.我认为最好的方法是做两次分裂.

    src=src.split('clicks": ')
    src = str(src[1])
    clicks = src.split('}, "status')
    clicks = clicks[0]
Run Code Online (Sandbox Code Playgroud)

当我运行它时,点击确实最终等于正确的数字,只有那个.但是,Terminal返回该行的IndexError src = str(src[1]).我试图摆脱它,str()但这没有影响.尽管最终价值得到纠正,我仍然非常理解为什么我会收到这个错误.

以下是Traceback的全部内容:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1701, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1689, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1687, in wsgi_app
    response = self.full_dispatch_request()
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1360, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1358, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Library/Python/2.7/site-packages/Flask-0.9-py2.7.egg/flask/app.py", line 1344, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/Zach/Dropbox/bitly/bit.py", line 35, in settings
    src = str(src[1])
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

先感谢您.

sbe*_*rry 6

这个响应是json,因此,解码json而不是尝试解析字符串.

>>> import json
>>> resp = '{"status_code": 200, "data": {"units": -1, "tz_offset": -4, "unit": "day", "link_clicks": 535}, "status_txt": "OK"}'
>>> resp_object = json.loads(resp)
>>> resp_object and resp_object.get('data', {}).get('link_clicks', 0) or 0
535
Run Code Online (Sandbox Code Playgroud)