我目前有一个脚本应该获取并返回Bit.ly链接所具有的点击次数。我从收集和读取Bitly网址中的数据开始,我似乎做得正确。
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]
当我运行此操作时,点击确实最终等于正确的数字而且只是那个数字。但是,Terminal返回行src = str(src[1])
的IndexError。我试图摆脱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
提前谢谢你。
答案 0 :(得分: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
答案 1 :(得分:2)
src
看起来像是JSON。为什么不使用json
模块直接读取它?
如果您不想使用json
,无论出于何种原因,请继续阅读:
错误是由您假设您拆分的子字符串存在于您拆分的字符串中引起的,即'clicks": '
确实是src
的子字符串。如果不是这种情况(因为我怀疑它不是在引发错误时),那么split
将返回一个只包含一个元素的列表,该元素为src
。
如果您更喜欢这种情况,那么src[1]
在调用src = src.split('clicks": ')
后会给您一个空字符串,那么您最好使用str.partition
:
In [5]: somestr = 'prefixclicks: "suffix'
In [6]: somestr.partition('clicks: "')
Out[6]: ('prefix', 'clicks: "', 'suffix')
In [7]: somestr.partition('clicks: "')[-1]
Out[7]: 'suffix'
In [8]: somestr = 'prefixsuffix'
In [9]: somestr.partition('clicks: "')
Out[9]: ('prefixsuffix', '', '')
In [10]: somestr.partition('clicks: "')[-1]
Out[10]: ''
希望这有帮助
答案 2 :(得分:0)
你可以试试这个来找出link_clicks
的价值,使用ast.literal_eval()
:
In [14]: import ast
In [15]: src=`{"status_code": 200, "data": {"units": -1, "tz_offset": -4, "unit": "day", "link_clicks": 535}, "status_txt": "OK"}`
In [16]: d=ast.literal_eval(src)
In [17]: d["data"]["link_clicks"]
Out[17]: 535