在[Pandas教學]資料分析必懂的Pandas DataFrame處理雙維度資料方法文章的分享中,可以得知Pandas DataFrame資料結構非常適合用於表格式資料的儲存及處理,也因此被應用於許多的情境,而讀取網頁上的表格(Table)資料則是最常見的應用之一。
所以本文將以統聯客運及全國電子網站為例,來分享如何利用Pandas DataFrame資料結構,讀取網頁上的表格(Table)資料,並且使用Pandas DataFrame所提供的方法(Method),進行簡單的資料整理。重點包含:
- 安裝Pandas套件
- Pandas讀取網頁表格資料
- Pandas轉置網頁表格資料
一、安裝Pandas及lxml套件
首先,利用以下指令安裝Pandas及lxml套件,其中的lxml套件是用來協助Pandas套件在讀取網頁表格資料時,解析HTML原始碼:
$ pip install pandas $ pip install lxml
二、Pandas讀取網頁表格資料
接下來,前往統聯客運乘車票價表網頁,截取部分如下圖:
在表格的地方點擊右鍵,選擇檢查,可以看到它的HTML原始碼結構如下圖:Pandas套件提供了read_html()方法(Method),只要傳入網址,就能夠讀取網頁中的<table>表格標籤,並且回傳一個Pandas DataFrame物件,<tr>標籤就是Pandas DataFrame資料結構的列(row),<td>標籤則是欄(column)。
本文以Visual Studio Code為例,建立一個資料夾及app.py檔案,並且在app.py檔案中,引用Pandas模組,並且取個別名叫「pd」,如下範例:
import pandas as pd
接著,呼叫Pandas模組的read_html()方法(Method),傳入統聯客運乘車票價表網址,如下範例:
import pandas as pd bus_table = pd.read_html("https://www.ubus.com.tw/Booking/FareInquiry") print(bus_table)
截取部分執行結果
import pandas as pd bus_table = pd.read_html("https://www.ubus.com.tw/Booking/FareInquiry") print("型態:", type(bus_table)) print("長度:", len(bus_table))
執行結果
import pandas as pd bus_table = pd.read_html("https://www.ubus.com.tw/Booking/FareInquiry") bus_df = bus_table[0] #讀取第一個表格 print(bus_df)
執行結果
import pandas as pd bus_table = pd.read_html("https://www.ubus.com.tw/Booking/FareInquiry") bus_df = bus_table[0] bus_df.columns = ["路線名稱", "優惠時段", "原價時段", "半票票價", "軍優票價", "去回票價"] print(bus_df)
執行結果
三、Pandas轉置網頁表格資料
在實務上除了像上面範例的表格橫向擺放資料外,另一種就是直向擺放,這時候就可以利用Pandas套件強大的轉置功能,變為橫向的表格。當然,轉置功能並不限於網頁表格,只要能夠儲存到Pandas DataFrame中的資料,都能使用。
以全國電子冰箱價格網頁為例,從下圖可以看到每一個冰箱的名稱、型號及價格都是直向擺放,如果想要利用Pandas套件讀取這樣的表格資料,並且轉置為橫向表格,該怎麼做呢?
在冰箱名稱的地方,點擊右鍵,選擇檢查,可以看到它的表格HTML原始碼結構為巢狀的,如下圖:
接著,開啟app.py檔案,利用Pandas模組的read_html()方法(Method)讀取網頁表格資料,並且選擇其中幾個表格來觀察,如下範例:
import pandas as pd product_table = pd.read_html("https://web.elifemall.com.tw/allnewweb/product.php?idept=100&showlist=&isdept=120") print(product_table[0]) #第一個表格 print("============================") print(product_table[1]) #第二個表格 print("============================") print(product_table[2]) #第三個表格
執行結果
而第二個表格則是分為三列(row)來顯示,第三個表格則為圖片的說明文字,這時候就可以發現我們所需要取得的表格順序為奇數個,並且從1開始,如下範例:
import pandas as pd product_table = pd.read_html("https://web.elifemall.com.tw/allnewweb/product.php?idept=100&showlist=&isdept=120") for index in range(1, len(product_table), 2): #從1開始到表格個數,遞增值為2 product_df = product_table[index] print(product_df)
執行結果
import pandas as pd product_table = pd.read_html("https://web.elifemall.com.tw/allnewweb/product.php?idept=100&showlist=&isdept=120") for index in range(1, len(product_table), 2): #從1開始到表格個數,遞增值為2 product_df = product_table[index].T # 轉置表格 print(product_df)
執行結果
import pandas as pd product_table = pd.read_html("https://web.elifemall.com.tw/allnewweb/product.php?idept=100&showlist=&isdept=120") df = pd.DataFrame() for index in range(1, len(product_table), 2): product_df = product_table[index].T # 轉置表格 df = pd.concat([df, product_df], ignore_index=True) # 合併DataFrame print(df)
執行結果
import pandas as pd product_table = pd.read_html("https://web.elifemall.com.tw/allnewweb/product.php?idept=100&showlist=&isdept=120") df = pd.DataFrame() for index in range(1, len(product_table), 2): product_df = product_table[index].T # 轉置表格 df = pd.concat([df, product_df], ignore_index=True) # 合併DataFrame df.columns = ["name", "model", "price"] # 自訂欄位名稱 df = df.groupby("name").first() # 以名稱來進行群組 print(df)
執行結果
四、小結
本文首先以統聯客運乘車票價表網站為例,帶大家瞭解Pandas套件如何透過read_html()方法(Method)來讀取網頁表格資料。最後以全國電子冰箱價格網頁為例,學會Pandas DataFrame的表格資料轉置功能,並且利用groupby()方法(Method)來群組資料,提升可讀性。希望這樣的內容能夠幫助大家理解Pandas套件讀取網頁表格的方式。
另外,大家都使用Pandas套件讀取什麼樣的網頁表格資料呢?歡迎在下面留言與我分享交流唷 :)
- Python學習資源整理
- [Pandas教學]資料分析必懂的Pandas DataFrame處理雙維度資料方法
- [Pandas教學]資料分析必懂的Pandas Series處理單維度資料方法
- [Python爬蟲教學]開發Python網頁爬蟲前需要知道的五個基本觀念
- [Python爬蟲教學]有效利用Python網頁爬蟲幫你自動化下載圖片
- [Python爬蟲教學]解析如何串接Google Sheet試算表寫入爬取的資料
- [Python爬蟲教學]活用openpyxl套件將爬取的資料寫入Excel檔案
- [Python爬蟲教學]輕鬆學會Python網頁爬蟲與MySQL資料庫的整合方式
- [Python爬蟲教學]整合Python Selenium及BeautifulSoup實現動態網頁爬蟲
- [Python爬蟲教學]Python網頁爬蟲動態翻頁的實作技巧
- [Python爬蟲教學]Python網頁爬蟲結合LINE Notify打造自動化訊息通知服務
- [Python+LINE Bot教學]建構具網頁爬蟲功能的LINE Bot機器人
留言
張貼留言