使用 BeautifulSoup 在 HTML 文件中查詢具有給定屬性值的標籤


從 HTML 頁面提取資料是網路爬蟲過程中的一項典型活動。HTML 頁面中發現的許多標籤和屬性有助於定位和提取相關資料。一個名為 BeautifulSoup 的知名 Python 模組可用於解析 HTML 文字並提取有用的資訊。在本教程中,我們將重點關注使用 BeautifulSoup 來查詢具有特定屬性值的標籤。

安裝和設定

為了開始,我們必須安裝 BeautifulSoup。可以使用 Python 的軟體包安裝程式 Pip 來完成此操作。以下命令應輸入到命令視窗或終端中:

pip install beautifulsoup4

安裝完成後,我們可以在 Python 程式碼中使用以下語句匯入 BeautifulSoup:

from bs4 import BeautifulSoup

語法

使用 BeautifulSoup 查詢具有給定屬性值的標籤的語法如下:

soup.find(tag_name, attrs={attribute_name: attribute_value})

這裡,soup 指的是包含已解析 HTML 內容的 BeautifulSoup 物件,tag name 指的是我們正在查詢的標籤,attribute name 指的是我們正在查詢的屬性,attribute value 指的是我們正在匹配的值。

演算法

  • 使用 BeautifulSoup 解析 HTML 文件

  • 使用 find() 方法查詢具有給定屬性值的標籤

  • 從標籤中提取所需資料

示例 1

要查詢具有類 "important" 的段落標籤,我們可以使用以下程式碼:

from bs4 import BeautifulSoup

html_doc="""<html>
   <body>
      <p class="important">Fancy content here, just a test</p>
      <p>This is a normal paragraph</p>
   </body>
</html>"""

soup = BeautifulSoup(html_doc, 'html.parser')
tag = soup.find('p', attrs={'class': 'important'})
print(tag)

輸出

<p class="important">Fancy content here, just a test</p>

soup 是包含已解析 HTML 文件的 BeautifulSoup 物件,'p' 是我們想要查詢的標籤名稱,'class' 是我們想要搜尋的屬性的名稱,'important' 是我們想要匹配的屬性的值。find() 方法返回第一個匹配給定條件的標籤,在本例中,是第一個具有類 "important" 的段落標籤。

示例 2

要查詢 id 為 "content" 的 div 標籤內的第一個段落標籤,我們可以使用以下程式碼:

from bs4 import BeautifulSoup
html_doc = """<html>
<body>
   <div id="header">
      <h1>Welcome to my website</h1>
      <p>All the help text needed will be in this paragraph</p>
   </div>
   <div id="content">
      <h2>Section 1</h2>
      <p>Content of section 1 goes here</p>
      <h2>Section 2</h2>
      <p>Content of section 2 goes here</p>
   </div>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
div_tag = soup.find('div', attrs={'id': 'content'})
tag = div_tag.find('p')
print(tag)

輸出

<p>Content of section 1 goes here</p>

這裡,soup 是包含已解析 HTML 文件的 BeautifulSoup 物件,'div' 是我們想要查詢的標籤名稱,'id' 是我們想要搜尋的屬性的名稱,'content' 是我們想要匹配的屬性的值。find() 方法返回第一個匹配給定條件的 div 標籤,在本例中,是 id 為 "content” 的 div 標籤。

示例 3

from bs4 import BeautifulSoup
html_doc="""<html>
<body>
   <h1>List of Books</h1>
   <table>
      <tr>
         <th>Title</th>
         <th>Author</th>
         <th>Price</th>
      </tr>
      <tr>
         <td><a href="book1.html">Book 1</a></td>
         <td>Author 1</td>
         <td>$10</td>
      </tr>
      <tr>
         <td><a href="book2.html">Book 2</a></td>
         <td>Author 2</td>
         <td>$15</td>
      </tr>
      <tr>
         <td><a href="book3.html">Book 3</a></td>
         <td>Author 3</td>
         <td>$20</td>
      </tr>
   </table>
</body>
</html>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
price_tag = soup.find('td', text='$15')
book_tag = price_tag.find_previous('td').find_previous('td').find_previous('td')
title = book_tag.text
author =  book_tag.find_next('td').text
print(title, author)

輸出

$10 Book 2

這裡,"soup" 指的是包含已解析 HTML 內容的 BeautifulSoup 物件,"td" 代表我們正在查詢的標籤名稱,"text" 代表我們正在嘗試匹配的文字,"$15" 代表該文字的值。在本例中,find() 函式返回第一個符合指定條件的 td 標籤,即包含字串 "$15" 的 td 標籤。

然後,使用 find previous() 函式查詢包含書籍標題和 href 屬性的 td 元素。此方法在文件樹中向後查詢,直到找到第一個符合指定條件的標籤,該標籤位於包含值 "$15" 的 td 標籤之前。

由於我們擁有書籍標題標籤,因此我們可以使用 text 屬性來檢索文字。下一步是使用 find next sibling() 函式查詢包含作者名稱的後續 td 標籤。此方法返回書籍標題 td 標籤之後的 td 標籤,因為它是具有相同父標籤的下一個兄弟標籤。

應用

查詢具有特定屬性值的標籤是一項常見的網路爬蟲活動,可用於各種應用中。

  • 使用網站資料建立機器學習模型或進行資料分析

  • 電子商務網站抓取以獲取產品資訊和價格比較

  • 使用招聘網站抓取來分析和跟蹤職位釋出

此任務可以使用多種網路抓取技術、程式語言(如 Python 和 BeautifulSoup)以及其他工具來完成。在進行任何網路抓取之前,閱讀網站的服務條款至關重要,因為某些網站可能已實施安全措施以防止抓取。

結論

本文介紹了 BeautifulSoup 的設定和安裝,BeautifulSoup 是一個強大的 Python 模組,它使從 HTML 和 XML 文件中提取資訊成為可能,介紹了用於識別具有給定屬性值的特定標籤的語法,並提供了有關如何在實際情況下正確使用這些技術的詳細說明。

find()

find_all()

方法都已涵蓋,以及如何在 HTML 頁面中查詢具有特定屬性值的標籤。BeautifulSoup 是一個靈活且強大的工具,它徹底改變了網路抓取的世界,並提供了大量的空間供進一步探索和實驗。

更新於: 2023年8月21日

367 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.