CodeGym /Java Adesua /Python SELF TW /根據 HTML 標籤和屬性提取數據

根據 HTML 標籤和屬性提取數據

Python SELF TW
等級 31 , 課堂 3
開放

1. HTML 樹狀結構導航

今天我們將深入 HTML 樹狀結構的神秘世界,學習如何像真正的程式設計忍者一樣從網頁中提取資訊。我們將繼續使用神奇的 BeautifulSoup 庫來獲取所需數據,並為我們已經相當智能的腳本增添更多功能。所以,潤滑下你的鍵盤,我們開始吧!

那麼,在提取數據之前,讓我們先弄清楚什麼是 HTML 樹狀結構。把它想像成一個巨大的家族樹,其中每個標籤都是獨立的親戚。有父母、子女、兄弟姐妹。我們的任務是找到特定的「親戚」,以便小心翼翼地從他們那裡提取有價值的家族傳家寶(或者說,數據)。

HTML 的片段可能看起來像這樣:

HTML

<div class="article">
    <h2 id="title">標題</h2>
    <p class="content">這是文章的文字...</p>
    <a href="https://example.com" class="link">閱讀更多</a>
</div>

在這裡我們有一個 div,它是 h2pa 的父標籤。每個元素都有自己的屬性和內容。

2. 根據標籤提取數據

BeautifulSoup 提供了方便的方法來導航樹結構並提取數據。讓我們從基礎方法 find() 開始,這可以幫助我們找到具有特定標籤的 第一個元素。而 find_all() 則像一個搜尋的推土機,會挖掘出具有指定標籤的 所有元素

python
                      
                        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. 使用屬性過濾元素

現在我們學會了如何根據標籤搜尋,是時候了解如何使用屬性過濾元素,比如 idclass。這些屬性就像頁面的書籤,可以幫助快速定位內容。

HTML

<div class="article">
    <h2 id="title">標題</h2>
    <p class="content">這是文章的文字...</p>
    <a href="https://example.com" class="link">閱讀更多</a>
</div>
Python

# 找到具有指定 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 陣列中提取鏈結和標題文本。以下是數據範例及處理方法:

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>

以下是我們如何提取標題和鏈結:

Python

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 世界的冒險才剛剛開始!

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