如果你認為網頁只是漂亮的圖片和文字,那我要告訴你一個事實:它們就像洋蔥一樣有多層結構,會讓你喜極而泣(當然是高興的淚水!)。今天我們將用 BeautifulSoup
挖掘 HTML 網頁。準備好你的虛擬小鍬——我們要開始動手了!
1. 分析 HTML 文件
簡單網頁
我們先來檢視一些簡單的 HTML 文件,了解它們的組成以及哪些元素可能是我們要提取的數據。
這是一個新聞頁面的例子:
<html>
<head>
<title>新聞</title>
</head>
<body>
<h1>今日頭條</h1>
<p>今天發生了一些重要的事情!</p>
</body>
</html>
在這個例子中,h1
包含文章的標題,而
p
則是主要內容。
HTML 結構對於資料爬取的影響
在使用 BeautifulSoup
之前,瞭解目標 HTML 的結構至關重要。這能幫助我們確定頁面哪些部分包含需要的數據。例如,如果你要提取頁面標題,專注於 <h1>
標籤,而提取列表時則使用 <ul>
和 <li>
。
為爬取數據做準備
開始提取數據之前,先確定頁面中的關鍵標籤和屬性。例如,若開發者使用了 class="headline"
屬性來標示標題,這會對你大有幫助。使用瀏覽器的開發工具來探索 HTML 結構。比如,在 Google Chrome 中右鍵點擊元素並選擇 "檢查"
。
2. 安裝及設置庫
安裝 BeautifulSoup
和 requests
我們將使用 BeautifulSoup
來處理 HTML,並用 requests
來下載 HTML 網頁。安裝它們非常簡單,只需在你的終端執行以下命令:
pip install beautifulsoup4 requests
配合使用 requests 和 BeautifulSoup
requests 可以請求網頁的 HTML,然後 BeautifulSoup
幫助分析它們。來看看範例程式碼:
import requests
from bs4 import BeautifulSoup
# 加載網頁
url = 'https://example.com'
response = requests.get(url)
# 使用 BeautifulSoup 解析頁面
soup = BeautifulSoup(response.text, 'html.parser')
# 提取頁面標題
title = soup.title.text
print('標題:', title)
3. 使用標籤導航和提取數據
導航方法
現在我們有了一個 HTML 文件,可以使用 BeautifulSoup
導航其中了。超棒的 .select()
方法讓你可以使用 CSS 選擇器來提取數據。
通過標籤提取數據
BeautifulSoup
提供了 find
和 find_all
來通過標籤尋找元素,幫助你獲取所需的數據。
# 找到第一個段落
paragraph = soup.find('p').text
print('第一個段落:', paragraph)
# 找到所有列表項
list_items = soup.find_all('li')
for item in list_items:
print('列表項:', item.text)
使用屬性篩選
有時候你可能需要提取特定條件的元素,例如有特定 class
的元素。BeautifulSoup
支援這種操作:
# 提取具有特定 class 的元素
headline = soup.find('h1', class_='main-headline').text
print('標題:', headline)
4. 使用 CSS 選擇器
什麼是 CSS 選擇器?
對於 Python 程式設計師來說,CSS 選擇器是一個強大的工具,能根據特定條件提取數據。它們能用來尋找具有共同樣式的元素,使爬取數據更靈活精確。
在 BeautifulSoup
中使用選擇器
BeautifulSoup
支援用 select
方法使用 CSS 選擇器。例如:
# 選擇所有鏈接
links = soup.select('a')
for link in links:
print('鏈接:', link['href'])
你還可以結合選擇器進行更精準的抽取。例如,soup.select('div.article h2')
將選取所有 div
中的 h2
元素,該 div
的 class 為 article
。
CSS 選擇器的實例
我們將實踐所學知識:選擇所有帶有 highlight
class 的段落並輸出它們的文本內容:
# 提取所有帶有 'highlight' class 的段落
highlighted_paragraphs = soup.select('p.highlight')
for para in highlighted_paragraphs:
print('突出顯示的段落:', para.text)
今天的內容就到這裡,記得練習你的爬取技術,期待下次再見。祝你在資料解析的世界中玩的開心!
GO TO FULL VERSION