読者です 読者をやめる 読者になる 読者になる

文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

pythonのurllib2でjsonを取得して解析する

python fabric

最近fabricを使い出した影響で、pythonのコードを少しづつ書くようになりました。

【python】fabricを触ってみた!【デプロイツール】 - 文系プログラマによるTIPSブログ
【デプロイ】Fabricを学ぶ:Vol.01:基本的な使い方を学ぶ【python】 - 文系プログラマによるTIPSブログ
【デプロイ】Fabricを学ぶ:Vol.02:tomcatの起動完了を監視する【python】 - 文系プログラマによるTIPSブログ


そこで今回、httpリクエストで取得したjsonpythonで解析してみたいと思います。

使用するjsonapi

恐らくjsonを返すAPIとして有名であろう「お天気Webサービス仕様」を使います。

お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報

レスポンスjson

APIのサンプルレスポンスに書いてあるものを一部抜粋しました。↓↓↓

{
   "publicTime" : "2013-01-29T11:00:00+0900",
   "title" : "福岡県 久留米 の天気",
   "description" : {
      "text" : " 九州北部地方は、高気圧に覆われて晴れています。\n\n 29日は、九州北部地方では、高気圧に覆われて晴れますが、気圧の谷の\n影響で、昼過ぎから次第に曇りとなるでしょう。\n\n 30日は、気圧の谷の影響ではじめ曇りますが、昼頃からは高気圧に覆わ\nれて概ね晴れるでしょう。\n\n 波の高さは、九州北部地方の沿岸の海域では、29日は1.5メートル、\n30日は1メートルでしょう。豊後水道では、29日と30日は1メートル\nでしょう。\n 福岡県の内海では、29日と30日は0.5メートルでしょう。",
      "publicTime" : "2013-01-29T10:37:00+0900"
   },
   "link" : "http://weather.livedoor.com/area/forecast/400040",
   "forecasts" : [
      {
         "dateLabel" : "今日",
         "telop" : "晴のち曇",
         "date" : "2013-01-29",
         "temperature" : {
            "min" : null,
            "max" : {
               "celsius" : "11",
               "fahrenheit" : "51.8"
            }
         },
         "image" : {
            "width" : 50,
            "url" : "http://weather.livedoor.com/img/icon/5.gif",
            "title" : "晴のち曇",
            "height" : 31
         }
      },
      {
         "dateLabel" : "明日",
         "telop" : "晴れ",
         "date" : "2013-01-30",
         "temperature" : {
            "min" : {
               "celsius" : "3",
               "fahrenheit" : "37.4"
            },
            "max" : {
               "celsius" : "13",
               "fahrenheit" : "55.4"
            }
         },
         "image" : {
            "width" : 50,
            "url" : "http://weather.livedoor.com/img/icon/1.gif",
            "title" : "晴れ",
            "height" : 31
         }
      }
   }
}

pythonjsonをパースする

サンプルソース
#coding:utf-8
import json, urllib2

url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=400040'
try:
    r = urllib2.urlopen(url)
    root = json.loads(r.read())
    print 'title=' + root['title']
    description = root['description']
    print 'publicTime=' + description['publicTime']

    forecasts = root['forecasts']
    for forecast in forecasts:
        print '    dateLabel=' + forecast['dateLabel'] + ',telop=' + forecast['telop'] + ',date=' + forecast['date']
finally:
    r.close()
実行結果
treemacpro-2:~ tree$ python ./jsonTest.py
title=福岡県 久留米 の天気
publicTime=2014-05-28T21:37:00+0900
    dateLabel=今日,telop=晴れ,date=2014-05-29
    dateLabel=明日,telop=晴時々曇,date=2014-05-30

よくあるミス

[] の部分は配列なので、forでループします。
ハッシュ部分は key['value'] で値を取得できます。

例えば

TypeError: string indices must be integers

こんなエラーがでる場合は、配列をハッシュで取得しようとしてよく起きます。



私はru◯yが嫌いなのであります!!

ファッキンru◯y!!



好き嫌いで言語使い分けるのやめろ

Pythonスタートブック

Pythonスタートブック

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

実践 Vagrant

実践 Vagrant