1. HTML 樹狀結構導航
今天我們將深入 HTML 樹狀結構的神秘世界,學習如何像真正的程式設計忍者一樣從網頁中提取資訊。我們將繼續使用神奇的 BeautifulSoup
庫來獲取所需數據,並為我們已經相當智能的腳本增添更多功能。所以,潤滑下你的鍵盤,我們開始吧!
那麼,在提取數據之前,讓我們先弄清楚什麼是 HTML 樹狀結構。把它想像成一個巨大的家族樹,其中每個標籤都是獨立的親戚。有父母、子女、兄弟姐妹。我們的任務是找到特定的「親戚」,以便小心翼翼地從他們那裡提取有價值的家族傳家寶(或者說,數據)。
HTML 的片段可能看起來像這樣:
<div class="article">
<h2 id="title">標題</h2>
<p class="content">這是文章的文字...</p>
<a href="https://example.com" class="link">閱讀更多</a>
</div>
在這裡我們有一個 div
,它是 h2
、p
和 a
的父標籤。每個元素都有自己的屬性和內容。
2. 根據標籤提取數據
BeautifulSoup
提供了方便的方法來導航樹結構並提取數據。讓我們從基礎方法 find()
開始,這可以幫助我們找到具有特定標籤的 第一個元素。而 find_all()
則像一個搜尋的推土機,會挖掘出具有指定標籤的 所有元素。
from bs4 import BeautifulSoup
html_doc = """<div class="article">
<h2 id="title">標題</h2>
<p class="content">這是文章的文字...</p>
<a href="https://example.com" class="link">閱讀更多</a>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
# 找到第一個段落
first_paragraph = soup.find('p')
print(first_paragraph.text) # 輸出: 這是文章的文字...
# 找到所有鏈結
all_links = soup.find_all('a')
for link in all_links:
print(link['href']) # 輸出: https://example.com
3. 使用屬性過濾元素
現在我們學會了如何根據標籤搜尋,是時候了解如何使用屬性過濾元素,比如 id
和 class
。這些屬性就像頁面的書籤,可以幫助快速定位內容。
<div class="article">
<h2 id="title">標題</h2>
<p class="content">這是文章的文字...</p>
<a href="https://example.com" class="link">閱讀更多</a>
</div>
# 找到具有指定 id 的元素
title = soup.find(id="title")
print(title.text) # 輸出: 標題
# 找到具有 "content" 類別的所有元素
content_paragraphs = soup.find_all(class_="content")
for p in content_paragraphs:
print(p.text) # 輸出: 這是文章的文字...
重要! 我們使用 class_
而不是 class
,這是為了避免與 Python 保留字衝突。
4. 根據條件實際提取數據
現在來動手練習!想像一下,你需要從一個包含多篇文章的 HTML 陣列中提取鏈結和標題文本。以下是數據範例及處理方法:
<div class="articles">
<div class="article">
<h2 class="title">第一篇文章</h2>
<a href="https://example.com/1" class="read-more">閱讀更多</a>
</div>
<div class="article">
<h2 class="title">第二篇文章</h2>
<a href="https://example.com/2" class="read-more">閱讀更多</a>
</div>
</div>
以下是我們如何提取標題和鏈結:
html_doc = """<div class="articles">
<div class="article">
<h2 class="title">第一篇文章</h2>
<a href="https://example.com/1" class="read-more">閱讀更多</a>
</div>
<div class="article">
<h2 class="title">第二篇文章</h2>
<a href="https://example.com/2" class="read-more">閱讀更多</a>
</div>
</div>"""
soup = BeautifulSoup(html_doc, 'html.parser')
articles = soup.find_all('div', class_='article')
for article in articles:
title = article.find('h2', class_='title').text
link = article.find('a', class_='read-more')['href']
print(f"標題: {title}, 鏈結: {link}")
# 輸出:
# 標題: 第一篇文章, 鏈結: https://example.com/1
# 標題: 第二篇文章, 鏈結: https://example.com/2
5. 潛在的陷阱
現在你已掌握基礎知識,讓我們來看看一些常見錯誤。其中一個最普遍的問題是試圖訪問不存在的屬性。對此,Python 會回應友善但仍讓人不快的 KeyError
。為了避免這種情況,可以使用 .get()
方法來獲取屬性,並提供默認值以防其缺失。
此外,不要忘記 HTML 元素可能是嵌套的,並具有複雜的結構。使用瀏覽器中的「檢查元素」功能來確認你理解結構,然後再嘗試使用 BeautifulSoup
提取數據。
我們下一站的精彩旅程將是使用 CSS 選擇器來更精準地定位並提取資訊。所以請繼續關注,由於在 BeautifulSoup
世界的冒險才剛剛開始!
GO TO FULL VERSION