簡介
在網路爬蟲開發中,資料提取是一個至關重要的步驟。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}")
程式碼解釋
sel = Selector(text=html)
作用:建立一個 Selector
物件來解析 HTML 文件。
-
Selector
是 Parsel 庫中的一個類,用於解析和處理 HTML 或 XML 文件。 -
text=html
:html
是一個字串,包含整個 HTML 文件的內容。text
引數將這個 HTML 字串傳遞給Selector
,讓它解析這個 HTML 文件。 -
sel
:是建立的Selector
物件,後續我們可以透過這個物件使用 XPath 表示式來選擇和提取 HTML 文件中的資料。
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
變數中。
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()