Pythonの学習の過程とか

学習の記録をつけておきましょう。Python3に少しずつ移行していきます。過去の記事のソースを2から3に、、、と考えましたが、新しいことをやったほうがいいですね。

Pythonの基礎 WebAPIを使ってみる YahooAPI(ショッピング、カテゴリランキング編)その3 JSONの解析

YahooAPIを使ってみる その3

さて、二つの関数を見ていきます。 前回は

def yapi_topics():

をとりあげましたので、今回は

def do_json(s):

の方を見ていきましょう。

YahooAPIで貰ってきた情報をJSON形式で読み込み、表示できるように加工する

やっていることはシンプルです。しかし、JSONに慣れていないと、どう熱かっていいか分からないですね 分からないなりに、丁寧に確認していきます。

メインにあたる部分

if __name__ == '__main__':
    json_str = yapi_topics() #前回確認しました
    do_json(json_str)          #今回はここ!!!

前回はYahooAPIに対してurllib.urlopen()で情報をもらうところまでやりました。 urllib.urlopen()は、ファイルを開くようにWeb上のデータを取得できるので、戻り値をread()して、戻り値としてjson_strを得ることができました。

今回は、そのjson_strを引数としてdo_json()に渡します。

では以下を見ていきましょう。

do_json(s)関数

def do_json(s):
    data = json.loads(s)
    #下の二行のコメントを外すと、yahooから得たJSON全部を表示して終了する。これで一度確認しみるとよい
    #print(json.dumps(data, sort_keys=True, indent=4))
    #sys.exit()
    
    #jsonの階層の"Result"以下を辞書にする。keyは番号:その次の配列がvalueになっている
    item_list = data["ResultSet"]["0"]["Result"]
    print(json.dumps(item_list, sort_keys=True, indent=4))
    
    #keyは番号その他になる。番号ならソートしやすいし、その他なら例外の処理をいれればよい
    print item_list.keys()  

    #空のディクショナリを作る
    ranking = {}
    for  k, v in item_list.iteritems():
        try:
            rank = int(v["_attributes"]["rank"])
            vector = v["_attributes"]["vector"]
            name  = v["Name"]
            ranking[rank] = [vector, name]
        except:
            if k == "RankingInfo":
                StartDate = v["StartDate"]
                EndDate = v["EndDate"]
    
    print '-' * 40
    print u"集計開始日:", StartDate
    print u"集計終了日:", EndDate
    print '-' * 40
    ranking_keys = list(ranking.keys())
    ranking_keys.sort()
    for i in ranking_keys:
        print i, ranking[i][0], ranking [i][1]

コード自体は短いのですが、何やら分からないことが多そうですね。

いや、よく見るとこれまでやってきたことと同じようにも見えますね!

では今回も少しずつ見ていきましょう(すみません、スピード感にかけますね、このブログは。。。。)

上記ではコメントになっている部分ですが、コメントを外してみます。

先にsys.exit()を説明しておきましょ

公式ページのsys.exit

Python を終了します。 exit() は SystemExit を送出するので、 try ステートメントの finally 節に終了処理を記述したり、上位レベルで例外を捕捉して exit 処理を中断したりすることができます。

要するに、中断ですね。 今回は、試しにJSONを表示させたら終わり、っていう趣旨で使います。 通常はエラー処理などで使うようですね。

json.dumps()については以前学んだので、それを参照しましょう。

def do_json(s):
    data = json.loads(s)
    #下の二行のコメントを外すと、yahooから得たJSON全部を表示して終了する。これで一度確認しみるとよい
    print(json.dumps(data, sort_keys=True, indent=4))
    sys.exit()

で、こうなります。

#実行結果
{
    "ResultSet": {
        "0": {
            "Result": {
                "0": {
                    "Code": "soukai_9000009984050",
                    "Image": {
                        "Id": "soukai_9000009984050",
                        "Medium": "http://item.shopping.c.yimg.jp/i/g/soukai_9000009984050",
                        "Small": "http://item.shopping.c.yimg.jp/i/c/soukai_9000009984050"
                    },
                    "Name": "\u30bf\u30a4\u30e0\u30bb\u30fc\u30eb\u4e2d\u3000\u30af\u30ea\u30b9\u30bf\u30eb\u30ac\u30a4\u30b6\u30fc(500mL*48\u672c\u5165) (\u6c34\u30df\u30cd\u30e9\u30eb\u30a6\u30a9\u30fc\u30bf\u30fc)",
                    "Review": {
                        "Count": "45",
                        "Rate": "4.78",
                        "Url": "http://shopping.yahoo.co.jp/review/item/list?store_id=soukai&page_key=9000009984050"
                    },
                    "Store": {
                        "Id": "soukai",
                        "Name": "\u723d\u5feb\u30c9\u30e9\u30c3\u30b0",
                        "Url": "http://store.shopping.yahoo.co.jp/soukai/index.html"
                    },
                    "Url": "http://store.shopping.yahoo.co.jp/soukai/9000009984050.html",
                    "_attributes": {
                        "rank": "1",
                        "type": "item",
                        "vector": "new"
                    }
                },
                "1": {
                    "Code": "adachinet-umai_yh-g30",
                    "Image": {
                        "Id": "adachinet-umai_yh-g30",
                        "Medium": "http://item.shopping.c.yimg.jp/i/g/adachinet-umai_yh-g30",
                        "Small": "http://item.shopping.c.yimg.jp/i/c/adachinet-umai_yh-g30"
                    },
                    "Name": "\u5c71\u5f62\u770c \u65b0\u7c73 1\u7b49\u7c73 \u306f\u3048\u306c\u304d \u767d\u7c73\u7d0427kg\u304b\u7384\u7c7330kg \u5e73\u621025\u5e74\u5ea6",
                    "Review": {
                        "Count": "1",
                        "Rate": "5.00",
                        "Url": "http://shopping.yahoo.co.jp/review/item/list?store_id=adachinet-umai&page_key=yh-g30"
                    },
                    "Store": {
                        "Id": "adachinet-umai",
                        "Name": "\u3042\u3060\u3061\u306d\u3063\u3068\u7f8e\u7c73\u5c4b",
                        "Url": "http://store.shopping.yahoo.co.jp/adachinet-umai/index.html"
                    },
                    "Url": "http://store.shopping.yahoo.co.jp/adachinet-umai/yh-g30.html",
                    "_attributes": {
                        "rank": "2",
                        "type": "item",
                        "vector": "new"
                    }
                },
                "10": {

               以下、つづく。。。。
def do_json(s):
    data = json.loads(s)

この関数の引数であるsは、YahooAPIからのレスポンスになります。レスポンスをread()したものが引数になっていますね。

data = json.

初めてのPython 第3版

初めてのPython 第3版

loads(s)で、そのレスポンスをJSONデータとしてdataに格納した訳ですね。

さて、あとはこれを解析して行くだけです。

簡単ですね!!