1

私は現在、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は次のような文字列です

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

この文字列を解析して、 の後の数値だけを取得したいと思いますlink_clicks。これを行う最善の方法は、2 つの分割を行うことだと考えました。

    src=src.split('clicks": ')
    src = str(src[1])
    clicks = src.split('}, "status')
    clicks = clicks[0]

これを実行すると、クリック数は最終的に正しい数になり、それだけになります。ただし、ターミナルは行の IndexError を返しますsrc = str(src[1])。を削除しようとしました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

前もって感謝します。

4

3 に答える 3

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
于 2012-10-31T20:30:10.103 に答える
2

srcJSONのようです。モジュールを使用しjsonて直接読み取ってみませんか?

何らかの理由で を使用したくない場合はjson、以下をお読みください。

このエラーは、分割した部分文字列が分割した文字列に存在する、つまり'clicks": '実際に の部分文字列であると想定したために発生しますsrc。そうでない場合 (エラーが発生したときはそうではないと思われるため)、split要素が 1 つだけのリストを返し、その要素は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]: ''

お役に立てれば

于 2012-10-31T20:37:43.143 に答える
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
于 2012-10-31T20:34:51.230 に答える