網頁技術學習筆記 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']
Leave a Reply