(一)如何使用 Parsel 和 XPath 進行網頁資料提取

梁剑lj發表於2024-08-03

簡介

在網路爬蟲開發中,資料提取是一個至關重要的步驟。Parsel 是一個強大的 Python 庫,結合 XPath,可以輕鬆從 HTML 或 XML 文件中提取所需資料。本文將介紹 Parsel 和 XPath 的基礎知識,並展示如何在實際專案中使用它們進行網頁資料提取。

什麼是 Parsel?

Parsel 是一個專門用於處理 HTML 和 XML 文件的 Python 庫。它提供了簡潔的 API,可以幫助開發者快速定位和提取文件中的資訊。Parsel 尤其適用於需要大量資料抓取的任務,特別是在 Scrapy 框架中,Parsel 是其核心元件之一。

什麼是 XPath?

XPath(XML Path Language)是一種用於在 XML 和 HTML 文件中定位節點的語言。它使用路徑表示式來選擇節點,可以透過元素名稱、屬性、索引、文字內容等多種方式進行選擇。

安裝 Parsel

在開始之前,我們需要安裝 Parsel 庫。你可以透過以下命令進行安裝:

pip install parsel

XPath 基礎

在學習如何使用 Parsel 之前,先來了解一些常用的 XPath 表示式:

  • /:從根節點選擇。
  • //:選擇文件中的所有匹配節點,不論它們的位置。
  • @:選擇屬性。
  • *:萬用字元,匹配任何元素。

常見的 XPath 表示式示例

/html/body/div  # 選擇從根節點到div元素的路徑
//a[@href]  # 選擇所有包含href屬性的a標籤
//p[text()]  # 選擇所有包含文字的p標籤

使用 Parsel 和 XPath 提取網頁資料

現在我們來看看如何使用 Parsel 和 XPath 從 HTML 文件中提取資料。

示例:提取標題和連結

假設我們有以下簡單的 HTML 程式碼:

<html>
  <body>
    <div class="content">
      <h1>Title</h1>
      <p class="description">This is a paragraph.</p>
      <a href="http://example.com">Link</a>
    </div>
  </body>
</html>

我們可以使用 Parsel 和 XPath 來提取標題、段落文字和連結。

from parsel import Selector

# HTML 文件
html = '''
<html>
  <body>
    <div class="content">
      <h1>Title</h1>
      <p class="description">This is a paragraph.</p>
      <a href="http://example.com">Link</a>
    </div>
  </body>
</html>
'''

# 建立一個 Selector 物件
sel = Selector(text=html)

# 使用 XPath 提取標題
title = sel.xpath('//h1/text()').get()
print(f"標題: {title}")

# 提取段落中的文字
paragraph = sel.xpath('//p[@class="description"]/text()').get()
print(f"段落: {paragraph}")

# 提取連結的 href 屬性
link = sel.xpath('//a/@href').get()
print(f"連結: {link}")

程式碼解釋

  1. sel = Selector(text=html)

作用:建立一個 Selector 物件來解析 HTML 文件。

  • Selector 是 Parsel 庫中的一個類,用於解析和處理 HTML 或 XML 文件。

  • text=htmlhtml 是一個字串,包含整個 HTML 文件的內容。text 引數將這個 HTML 字串傳遞給 Selector,讓它解析這個 HTML 文件。

  • sel:是建立的 Selector 物件,後續我們可以透過這個物件使用 XPath 表示式來選擇和提取 HTML 文件中的資料。

  1. title = sel.xpath('//h1/text()').get()

作用:使用 XPath 表示式從 HTML 文件中提取 <h1> 標籤的文字內容。

  • sel.xpath('//h1/text()')

    • sel 是前面建立的 Selector 物件。

    • xpath() 方法用於在 HTML 文件中查詢符合條件的節點。

    • '//h1/text()'
      

      是一個 XPath 表示式,表示選擇文件中所有的

      <h1>
      

      標籤並提取它們的文字內容:

      • //:表示選擇文件中所有匹配的節點,不論它們的位置。
      • h1:表示選擇所有的 <h1> 標籤。
      • /text():表示從這些 <h1> 標籤中提取純文字內容。
  • .get():從匹配的結果中提取第一個文字內容(如果有多個 <h1> 標籤,它只返回第一個)。

  • title:提取的文字內容被儲存在 title 變數中。

  1. print(f"標題: {title}")

作用:將提取到的標題內容列印出來。

  • print():將資訊輸出到控制檯或終端。
  • f"標題: {title}":這是一個格式化字串(f-string),其中 {title} 會被替換為變數 title 的值。
  • 輸出結果會是 "標題: " 後面跟著從 <h1> 標籤中提取的文字內容。

輸出結果

標題: Title
段落: This is a paragraph.
連結: http://example.com

更多的 XPath 和 Parsel 功能

Parsel 還支援很多高階功能,比如選擇多個元素、巢狀選擇器以及結合正規表示式進行復雜的文字提取。

選擇多個元素

如果你想提取頁面中的所有連結文字,可以使用 getall() 方法:

python複製程式碼links = sel.xpath('//a/text()').getall()
print(f"所有連結文字: {links}")

巢狀選擇器

你可以在一個選擇器中進一步選擇子元素,例如:

python複製程式碼content = sel.xpath('//div[@class="content"]')
title = content.xpath('.//h1/text()').get()

相關文章