網頁技術學習筆記 002–以 Python 擷取、處理 json 資料

簡述

因應有人問如何以 Python 處理這個網頁的 json 資料。

json 解析

該網頁內容如下,我刻意劃分開每一筆資料以供解析:

showStoreList(
[ 
  { "NAME": "全家京江店", "TEL": "02-25678224", "px": 121.531373, "py": 25.052696, "addr": "台北市中山區一江街22號", "SERID": 18902.0, "pkey": "010958", "post": "104", "all": "COFFEE,SWEETPOTATO,WiFi,Rest", "road": "一江街" },
  { "NAME": "全家直學店", "TEL": "02-25328364", "px": 121.546531, "py": 25.080829, "addr": "台北市中山區大直街11號", "SERID": 51865.0, "pkey": "011865", "post": "104", "all": "COFFEE,WiFi,icecream,oneice", "road": "大直街" },
  { "NAME": "全家大直店", "TEL": "02-25328875", "px": 121.546504, "py": 25.082196, "addr": "台北市中山區大直街33巷1號", "SERID": 11115.0, "pkey": "001752", "post": "104", "all": "COFFEE,SWEETPOTATO,WiFi,Rest", "road": "大直街" },
  { "NAME": "全家市民店", "TEL": "02-25638109", "px": 121.520695, "py": 25.04851, "addr": "台北市中山區中山北路一段58號", "SERID": 18703.0, "pkey": "012022", "post": "104", "all": "twoice,COFFEE,SWEETPOTATO,WiFi", "road": "中山北路一段" }, 
...
...
...
...
  { "NAME": "全家雙城店", "TEL": "02-25996056", "px": 121.524221, "py": 25.064541, "addr": "台北市中山區雙城街12-1號", "SERID": 10261.0, "pkey": "010571", "post": "104", "all": "COFFEE,SWEETPOTATO,WiFi", "road": "雙城街" }
]

json 的兩種基本格式,一個是以中括號 [ ] 來表示的array,另一種是以大括號{}來表示的objects

  • array ,就是像這樣 [1,4,6,”ab”… ]
  • objects ,就是像這樣  { “key1” : “value1” , “key2” : “value2” , “key3″:”value3” … }

在 json 的世界裡,這兩種格式沒有誰的維度一定要比誰高或低。

如果屬於 array 的資料要取出內容,那就用索引值來取,例如 array[3] 取出陣列第四個元素。如果屬於objects的,要取出內容,就使用 key,例如 obj[“key1”]  取出對應 key1 的那筆資料。

回到上面的真實資料

可以看到最外層是個 [ ],所以資料的第一個維度是 json 的 array,每個 array 元素就是一間全家分店之資料(或說一包XD),總共有 73 個元素。

再來內層是個 { },所以資料的第二個維度是 json 的 objects ,可見到裡面有 “NAME”、 “TEL” 等等 key,分別對應”全家京江店”、”02-25678224″這樣的 value。

若以 json 解析,假設結果寫入了 hj 內,那 hj 的第一層級就是一個含有 73 的元素的陣列 hj[0] ~ hj[72],若單獨看 hj[0] = { “NAME”: “全家京江店”, “TEL”: “02-25678224”, “px”: 121.531373, “py”: 25.052696, “addr”: “台北市中山區一江街22號”, “SERID”: 18902.0, “pkey”: “010958”, “post”: “104”, “all”: “COFFEE,SWEETPOTATO,WiFi,Rest”, “road”: “一江街” }

而第二層級是 object ,有 10 組 key 與 value,若取 hj[0][“NAME”] 則會得到 “全家京江店” 的結果。

整理以上的想法成程式碼,如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
# -----------------------------
import sys
import urllib2
import json
h1 = urllib2.urlopen(r'http://api.map.com.tw/net/familyShop.aspx?searchType=ShopList&type=&city=%E5%8F%B0%E5%
h2=h1.read()
pos_start = h2.find('(')
pos_end = h2.find(')')
h3=h2[(pos_start+1):pos_end]
hj = json.loads(h3)
for i in range(len(hj)):
    print hj[i]['NAME']
    print hj[i]['TEL']
    print hj[i]['px']
    print hj[i]['py']
    print hj[i]['addr']
    print hj[i]['SERID']
    print hj[i]['pkey']
    print hj[i]['post']
    print hj[i]['all']
    print hj[i]['road']

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料