Skip to main content
 首页 » 编程设计

python之为什么我会得到一个(看似)正确拆分的字符串的 IndexError

2025年05月04日21myhome

我目前有一个脚本应该获取并返回 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() 

当 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] 

当我运行它时,点击次数最终确实等于正确的数字,而且仅此而已。但是,终端为 src = str(src[1]) 行返回 IndexError。我尝试摆脱 str() 但这没有效果。非常感谢尽管最终值已得到纠正,但我仍会收到此错误的理解。

这是完整的回溯:

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 

提前致谢。

请您参考如下方法:

此响应是 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