CodeGym /課程 /Python SELF TW /從表格和清單中獲取數據

從表格和清單中獲取數據

Python SELF TW
等級 32 , 課堂 2
開放

1. 提取表格數據

表格跟洋蔥有什麼共同點?對,層層結構!

HTML中的表格有點像千層派,內部包含元件 <table>, <tr>(行), <th>(表頭單元格)和 <td>(普通單元格)。這些元件各自都有它們的角色,要從中提取信息,我們必須一層一層地處理。

實作,實作,還是實作!

我們從下面這個簡單的HTML表格開始:

HTML
<table>
 <tr>
 <th>名字</th>
 <th>年齡</th>
 <th>城市</th>
 </tr>
 <tr>
 <td>艾莉絲</td>
 <td>29</td>
 <td>莫斯科</td>
 </tr>
 <tr>
 <td>Bob</td>
 <td>34</td>
 <td>聖彼得堡</td>
 </tr>
</table>

步驟 1: 在頁面中尋找表格

表格在網頁中是由HTML tag <table> 定義的,表格中的數據是由 <tr>(表格行) 和 <td>(數據單元格)包裹的。在 BeautifulSoup 中方法 find 可以找到頁面中的第一個表格,而用 find_all 能找到頁面中所有的表格。

Python
# 搜尋頁面中的第一個表格
table = soup.find("table")

如果想提取某個特定的表格,可以在搜尋時設置更多屬性,比如 idclass

Python

# 根據 class 搜尋特定表格
table = soup.find("table", {"class": "table-class"})

步驟 2: 從表格中提取數據

獲取表格後,可以開始提取數據。表格中的數據通常是按行排列的,所以邏輯上我們需要逐行遍歷,然後提取每一個單元格中的數據。

提取表頭

表格的表頭通常在第一行,用 <th> tag 包裹。通過 find_all 方法可以把所有表頭放入一個列表中。

Python
# 提取表格第一行的表頭
headers = []
header_row = table.find("tr")
for th in header_row.find_all("th"):
headers.append(th.text.strip())

print("表格表頭:", headers)

提取數據行

提取表格數據行(通常用 <tr> 包裹,每個單元格用 <td> 包裹),可以用嵌套的循環:先找到所有的行 <tr>,然後遍歷每一行中的單元格 <td>

Python

# 提取所有數據行
data = []
rows = table.find_all("tr")[1:]  # 忽略第一行的表頭

for row in rows:
row_data = []
for cell in row.find_all("td"):
row_data.append(cell.text.strip())
data.append(row_data)

print("表格數據:", data)

這段代碼會逐行遍歷表格,從每個單元格中提取文字。是不是覺得很神奇?當然,我們都知道,奇蹟本身就是迴圈的魔法!

2. 使用清單

清單—表格的進化版

世界上有兩種無窮的東西:表格和清單。清單用 <ul> (未編號清單) 和 <ol> (編號清單) 表現,而每個清單項目是 <li>。與表格相比,清單簡單且極簡,讓它們成為快速高效處理數據的理想選擇!

提取清單數據

看這個HTML清單的範例:

HTML

<ul>
 <li>蘋果</li>
 <li>香蕉</li>
 <li>葡萄</li>
</ul>

現在用我們熟悉的 BeautifulSoup 來提取這些數據:

Python

html = """
<ul>
  <li>蘋果</li>
  <li>香蕉</li>
  <li>葡萄</li>
</ul>
"""

soup = BeautifulSoup(html, 'html.parser')

ul = soup.find('ul')
items = ul.find_all('li')

for item in items:
    print(item.get_text())

就這樣!簡單但有效的方法,可以應用於更複雜的結構。

3. 表格數據提取和處理範例

為了鞏固知識,讓我們試試從一個更複雜的結構中提取數據:

HTML

<table id="courses">
 <tr>
 <th>課程</th>
 <th>講師</th>
 </tr>
 <tr>
 <td>Python入門</td>
 <td>Guido van Rossum</td>
 </tr>
 <tr>
 <td>Python自動化</td>
 <td>Eric Matthes</td>
 </tr>
</table>

<ul class="technologies">
 <li>Python</li>
 <li>JavaScript</li>
 <li>HTML & CSS</li>
</ul>

要從表格和清單中提取數據,可以這樣設置提取邏輯:

Python

html = """
<table id="courses">
  <tr>
    <th>課程</th>
    <th>講師</th>
  </tr>
  <tr>
    <td>Python入門</td>
    <td>Guido van Rossum</td>
  </tr>
  <tr>
    <td>Python自動化</td>
    <td>Eric Matthes</td>
  </tr>
</table>

<ul class="technologies">
  <li>Python</li>
  <li>JavaScript</li>
  <li>HTML & CSS</li>
</ul>
"""

soup = BeautifulSoup(html, 'html.parser')

# 從表格中提取數據
course_table = soup.find('table', id='courses')
course_rows = course_table.find_all('tr')

for row in course_rows:
    cells = row.find_all(['th', 'td'])
    for cell in cells:
        print(cell.get_text())

print("---")

# 從清單中提取數據
tech_list = soup.find('ul', class_='technologies')
tech_items = tech_list.find_all('li')

for item in tech_items:
    print(item.get_text())

這段代碼涵蓋了兩類數據。注意我們是如何使用id和class來準確定位元素。在實際應用中,你可能會遇到更複雜的HTML結構,但方法還是一樣的:從高層級開始,分解元素,最後提取重要的數據!

4. 部分總結與常見錯誤

處理網頁上的表格和清單就像穿越迷宮。有時,我們可能會遇到不完美的數據,比如空單元格或缺失元素。在這種情況下,檢查數據的正確性和完整性非常重要。常見的錯誤可能包括試圖訪問不存在的元素或錯誤使用選擇器。記住,HTML可能並不像我們希望的那麼乾淨和結構化,因此始終考慮使用例外處理和數據檢查。

這些知識有什麼用?

本次講座中的知識可以幫助你自動化提取和處理來自多個線上來源的數據。例如,可以自動收集股票交易所的表格數據、設置電商價格監控,甚至定期分析博客和新聞網站的數據。掌握表格和清單數據提取技術,為你的自動化和數據分析開啟了一扇新大門!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION