【開放數據轉換PDF實戰】學Python程式做分析 逐步拆解年度計劃1

撰文:簡浩德
出版:更新:

《香港01》早前報道,政府以PDF格式公布政府83個部門的開放數據計劃,並就計劃內容進行分析。要分析這批資料,其中一個方法就是編寫程式以撮取資料,今次特別推出一系列文章,逐步講解如何利用程式,一次過將83個PDF轉為分析用數據,亦希望藉此讓讀者了解機讀格式檔如何有助分析。

【第1講】

TL;DR

1)2019年1月3日,政府開記者會公佈 2019 年將有約 650 個新數據集開放予公眾使用。
2)「開放數據政策」年度計劃分別以 83 個 PDF 檔案展示。
3)下載、分析、整合這些 PDF 檔案你也可以做到。

是次政府公布,對於關注政府開放數據的人士可謂一項喜訊,在政府資訊科技總監辦公室(資科辦)協調和組織下,政府終於制定各部門開放數據政策的時間表,對監察政府運作有興趣或從事應用程式開發的市民可以有跡可尋,不用再無了期等待。

這個系列文章將會由下載、整理到分析,逐步撰寫電腦程式示範操作,最終得出可一份睇清83個政府部門所列出2019年內政府將會發放數據集的表格,可用作統合分析及持續監察「開放數據」進度之用。同時以具體例子演示「開放數據」理應所需達到的數據品質,並解說在整理現行資料格式所遇到的困難。

最終整理後的結果如下,供讀者參閱或使用,及歡迎提供意見(omarkan@hk01.com)。一切資料均以政府網頁公布為準,《香港01》將不為有關資料引起之任何損失或誤會負責。

連結如下:

https://docs.google.com/spreadsheets/d/1HIL7l_ICuZTUcbgbNVjy9U8neDvhsKF-Wt0b3LiEVkk/edit?usp=sharing

經程式轉換PDF而成的資料表格,讀者可試下載 CSV 檔案作學習、練習用途。

《香港01》翻閱了部分「開放數據政策」年度計劃文件,有以下的疑問:

問題(#1):650個新數據集是甚麼?

進度表。

政府的新聞稿中沒有直接的答案,但提供了線索:要瀏覽「資料一線通」網站。

政府「資料一線通」列出各部門公布數據時間表。(網站截圖)

問題(#2):可以從哪裡看到這些計劃?

「開放數據政策」年度計劃檔案的超連結可到 「資料一線通」網站 https://data.gov.hk/tc/annual-open-data-plans 查閱,當中分別是 83 個不同政府部門的網站連結。一般市民需要每次開啟一個網站,再下載相應的 PDF 檔案。

問題(#3):會不會有更快捷的方法?

如果不想麻煩地逐個連結開啟,確是有更快捷的方法,交由電腦代勞。首先要知道 83 個政府網頁連結,撰寫程式,讀取網頁內容,抽取出「開放數據政策」年度計劃文件 PDF 檔案的連結,經程式整理後,最終可以集中到單一個檔案作查閱或分析。

問題(#4):即是有哪 83 個政府網頁連結?

進度表。

眼利讀者的或會立即法發現這條連結「 https://s3-ap-southeast-1.amazonaws.com/psi-file-depot/prod/annual-open-data-plans-bd-list.json 」。(想知道如何找出這條連結可以到這篇這篇。)這是一個符合開放數據國際標準的 JSON 檔案(詳情請參閱這篇),屬於便利數據分析的類別。打開這個 JSON 檔案的連結,會發現上面寫著各政府部門「開放數據政策」網頁的連結。

如何可以一眼看到這 JSON 檔案的連結,詳情請參閱這篇

小結:
讀者已掌握到使用「開發人員工具」找尋有用的資料連結。接下來就是探討如何利用這個數據資料作進一步處理。

【第2講】

TL;DR

1)下載一個網上的 JSON 檔案
2)讀取 JSON 檔案的內容
3)儲存結果到電腦

問題(#5):有了 JSON 連結,怎樣開始?

進度表。

接下來會使用 Python 程式作為示範。若你的電腦未可運行 Python 程式碼(請參閱這篇)先作設定。接下來安裝 Requests 、PyQuery 、Pandas、lxml、hyperlink 這5個程式庫,在稍後的步驟中使用。 

「命令列」中輸入「pip install requests pyquery pandas lxml hyperlink」

然後使用「純文字編輯程式」撰寫(使用方法參閱這篇),請複製下列程式碼,並貼上到「純文字編輯程式」中。

儲存成 01_download_json.py (可參考這篇

在「命令列」運行
python 01_download_json.py(可參考這篇

Python 程式會調用 requests 程式庫,下載一個由「資料一線通」網站維護的 JSON 檔案,然然使用JSON標準程式庫讀取,以及從中抽取出內容,包括各部門的中文名稱('provider_name_tc')及其「開放數據政策」網頁的連結('provider_url_tc'),並顯示出到「命令列」的版面上。

運行結果如下:

運行畫面。

程式把 JSON 檔案內的部門連結,以列表的形式顯示出來。讀者也許會發現「 在職家庭及學生資助事務處」與「財經事務及庫務局」沒有相應的網址。

如果再次 https://data.gov.hk/tc/annual-open-data-plans 查閱,發現原來「財經事務及庫務局」分為「財經事務科」、「庫務科」並載有連結。同樣地,「在職家庭及學生資助事務處」亦分拆為「學生資助處」、「在職家庭津貼辦事處」才有連結。

再打開 JSON 檔案進一步研究,搜尋「Financial Services and the Treasury Bureau」發現「provider_url_tc」鍵值是空白,另外多了一個鍵值:「branch_array」,內層裡的項目「provider_url_tc」這個鍵值才有網址。

這時,必需要修改 Python 程式去處理這些特殊情況。

請複製下列程式碼,並貼上到「純文字編輯程式」中,完全取代舊有的程式碼。有顏色的程式碼是經修改的地方,需特別注意。

儲存檔案的修改部分後,請再次在「命令列」中,運行 python 01_download_json.py(可參考這篇
 
運行結果就是會得到 83 個網址,83 條政府「開放數據政策」年度計劃網頁的網址。

小結:
讀者已掌握到使用 Python 程式下載網上資源,例如 JSON 檔案等。接下來會使用更多的 Python 程式的功能去做更深入的工作,回答最初的疑問。

下一步是...?

1)指使程式打開一個網頁
2)抽取 PDF 所在連結
3)紀錄相應的資料,包括政府部門,網頁連結,PDF 連結
4)下載並儲存 PDF 檔案
5)撰寫另一支程式,讀取內容
6)整理內容
7)分析內容
8)解答原初問題

下周再續...

注意事項:
此系列以 Windows 7 中文版 及 Python 3.7.2 於 2019年1月28日至31日期間測試,並力求有關資料於上述期間內準確,惟市面上不同電腦作業系統或會有不相同的執行結果,希望讀者理解。如有任何使用上的困難,請詳細參閱互聯網上其他相關資源,或向其他擁有此項相關專門知識的人士或機構進一步查詢。一切資料均以政府網頁公布為準,《香港01》將不為有關資料引起之任何損失或誤會負責。