簡體   English   中英

為什么我(似乎)正確分割的字符串出現IndexError?

[英]Why am I getting an IndexError for a (seemingly) properly-split string?

我目前有一個腳本,該腳本應該獲取並返回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是諸如TY8lndsrc是一個看起來像這樣的字符串

{“狀態代碼”:200,“數據”:{“單位”:-1,“ tz_offset”:-4,“單位”:“天”,“鏈接點擊次數”:535},“狀態文本”:“確定”}

我現在想解析該字符串,以獲取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

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]: ''

希望這可以幫助

您可以嘗試使用ast.literal_eval()來找出link_clicks的值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM