Makzan

我管理世界職業技能競賽之網站技術項目、舉辦本地設計與開發賽事、開課分享技術心得。一個用網頁來表達自己的作家。

Python|使用 Untangle 拆解 XML API 獲取澳門停車場剩餘車位量

發布於
在停車場車位資訊數據中,首先會有基本信息,主要需要知道數據格式是甚麼,例如這個是 XML。另外有些是 JSON,有些供下載的則可能是 XLSX 或者 XML 等。針對不同的格式,我們會使用不同的方法來處理。例如 XML 數據,除了使用 Python 內置的 XML 模組外,亦推介使用第三方的 Untangle 模組,這個模組可以方便將 XML 網址或字串返回成物件類型。

在澳門政府數據開放平台 data.gov.mo 中有若干數據可以使用,其中包括停車場剩餘車位數量等實用資訊。

澳門政府數據開放平台

停車場車位資訊通常在右下方的「熱門數據集」中可以找到。否則,可以在公共交通,交通事務局的數據分類中找到,名為「停車場車位資訊」的數據。

澳門政府數據開放平台分為下載使用的及直接 API 網址使用的。通常視乎更新頻率而定。例如停車場車位資料這些頻繁數據更新的,我們會使用 API 即時存取。而像餐廳資料等沒有實時更新需求的,則可以下載檔案後再讀取分析。

停車場 API

停車場車位資訊 API

停車場車位資訊數據中,首先會有基本信息,主要需要知道數據格式是甚麼,例如這個是 XML。另外有些是 JSON,有些供下載的則可能是 XLSX 或者 XML 等。針對不同的格式,我們會使用不同的方法來處理。例如 XML 數據,除了使用 Python 內置的 XML 模組外,亦推介使用第三方的 Untangle 模組,這個模組可以方便將 XML 網址或字串返回成物件類型。

停車場 API 基本資料

緊接著是數據字段,即當中每筆記錄包括甚麼屬性資料。要注意的是,這個政府開放數據平台的數據描述有時會有錯字。實際應用時要注意拿到的數據才是真的。另外也要注意,是真實返回數據亦有機會有錯字,甚至有影響XML結構的情況出現。幸好,這個停車場車位量 API 暫時未有上述情況。

停車場 API 字段

最底就是 API 的調用方法。包括網址、GET 還是POST 方法、及調用的授權資料等。

API 調用很少有完全不用授權的。大多都需要起碼建立免費帳號取得 API 授權碼。而政府開放平台上的API,暫時不用建立帳號,大多只需填上統一的授權碼便可以。

停車場 API 信息

Untangle 拆解 XML

Untangle 可以很方便的直接貼上 XML 網址,例如澳門天氣 API 便可以。但由於這個停車場API 需要自定義 header資料。所以我們不能方便地直接給網址,而是需要多兩步,使用 requests 取得返回 XML 值再交給 untangle。

import untangle
import requests

url = "https://dsat.apigateway.data.gov.mo/car_park_maintance"

headers = {
        "Authorization": "APPCODE 09d43a591fba407fb862412970667de4"
}

res = requests.get(url, headers=headers)
res.encoding="UTF-8"

data = untangle.parse(res.text)

Untangle 開啟 XML 數據後,我們可以通過 dir(data) 來逐層檢視其 XML 結構。

例如 dir(data) 會得出 ['CarPark']。

XML 的頂層都有一個元素,通過 dir(data.CarPark),可以見到一堆 Car_park_info 的列表。即我們可以通過 for 循環逐個逐個檢視。

dir() 得出 XML 轉換 Python 物件後的結構

可以首先逐個印出來檢視一下。

for carpark in data.CarPark.Car_park_info:
   print(carpark)
檢視每筆停車場資料

可以見到每個 Car_park_info 有我們需要的屬性,包括停車場名稱及車位剩餘數量。於是,我們可以進一步整埋,只列印名稱及剩餘車位數量。

for carpark in data.CarPark.Car_park_info:   
   name = carpark["name"]
   car = carpark["Car_CNT"]
   print(name, car)

可以得出現時所有澳門公共停車場車位數量。

列出澳門公共停車場剩餘量

進一步,我們可以憑名稱搜尋前往目標附近的停車場資訊。

targets=["栢佳", "栢湖"]
for carpark in data.CarPark.Car_park_info:   
   name = carpark["name"]
   car = carpark["Car_CNT"]   
   for target in targets:
       if target in name:
           print(name, car)

原整代碼:

https://gist.github.com/makzan/c02d35dcf5bd13760255fc1d9580b621

「喂 Siri,返屋企有冇車位」

我在《使用 Pyto 將 LIKE 幣價放到 iOS 主畫面(及使用 Siri 語音觸發)》一文中提及「喂 Siri,返屋企有冇車位」,就是用上述的 Python 代碼,放在 iPhone 上配合 Shortcuts app 以語音觸發執行。

「喂 Siri,返屋企有冇車位」

— 麥誠 Makzan,2021-12-22。


我是麥誠軒(Makzan),除了正職外,平常我要麼辦本地賽與辦世界賽,要麼任教編程與網站開發的在職培訓。現正轉型將面授培訓內容寫成電子書、網上教材等,至今撰寫了 7 本書, 2 個視頻教學課程。

如果我的文章有價值,請左下角按讚支持,或訂閱贊助我持續創作及分享。

喜歡我的文章嗎?
別忘了給點支持與讚賞,讓我知道創作的路上有你陪伴。

CC BY-NC-ND 2.0 版權聲明

使用 Pyto 將 LIKE 幣價放到 iOS 主畫面(及使用 Siri 語音觸發)

什麼是API,能吃嗎?

教學文系列

2

看不過癮?

一鍵登入,即可加入全球最優質中文創作社區