Python爬蟲之解析HTML頁面詳解

用Python解析HTML頁面

在網絡爬取的過程中,我們通常需要對所爬取的頁面進行解析,從中提取我們需要的數據。網頁的結構通常是由 HTML 標簽所組成的,通過對這些標簽的解析,可以得到網頁中所包含的有用信息。在 Python 中,有三種常見的 HTML 解析方式:正則表達式解析、XPath 解析和 CSS 選擇器解析。本文將為大傢介紹這三種解析方式的基本使用方法。

HTML 頁面的結構

在講解 HTML 解析方式之前,我們需要先瞭解一下 HTML 頁面的基本結構。當我們在瀏覽器中打開一個網站,並通過鼠標右鍵菜單選擇“顯示網頁源代碼”菜單項時,就可以看到網頁對應的 HTML 代碼。HTML 代碼通常由標簽、屬性和文本組成。標簽用於承載頁面要顯示的內容,屬性用於補充標簽的信息,而文本則是標簽所顯示的內容。下面是一個簡單的 HTML 頁面代碼結構示例:

<!DOCTYPE html>
<html>
    <head>
        <!-- head 標簽中的內容不會在瀏覽器窗口中顯示 -->
        <title>這是頁面標題</title>
    </head>
    <body>
        <!-- body 標簽中的內容會在瀏覽器窗口中顯示 -->
        <h1>這是一級標題</h1>
        <p>這是一段文本</p>
    </body>
</html>

在這個 HTML 頁面代碼示例中,<!DOCTYPE html>是文檔類型聲明,<html>標簽是整個頁面的根標簽,<head><body><html>標簽的子標簽,放在<body>標簽下的內容會顯示在瀏覽器窗口中,這部分內容是網頁的主體;放在<head>標簽下的內容不會在瀏覽器窗口中顯示,但是卻包含瞭頁面重要的元信息,通常稱之為網頁的頭部。HTML 頁面大致的代碼結構如下所示:

<!DOCTYPE html>
<html>
    <head>
        <!-- 頁面的元信息,如字符編碼、標題、關鍵字、媒體查詢等 -->
    </head>
    <body>
        <!-- 頁面的主體,顯示在瀏覽器窗口中的內容 -->
    </body>
</html>

在 HTML 頁面中,標簽、層疊樣式表(CSS)和 JavaScript 是構成頁面的三要素。標簽用來承載頁面要顯示的內容,CSS 負責對頁面的渲染,而 JavaScript 用來控制頁面的交互式行為。要實現 HTML 頁面的解析,可以使用 XPath 的語法,它原本是 XML 的一種查詢語法,可以根據 HTML 標簽的層次結構提取標簽中的內容或標簽屬性;此外,也可以使用 CSS 選擇器來定位頁面元素,就跟用 CSS 渲染頁面元素是同樣的道理。

XPath 解析

XPath 是在 XML(eXtensible Markup Language)文檔中查找信息的一種語法,XML 跟 HTML 類似也是一種用標簽承載數據的標簽語言,不同之處在於 XML 的標簽是可擴展的,可以自定義的,而且 XML 對語法有更嚴格的要求。XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集,這裡所說的節點包括元素、屬性、文本、命名空間、處理指令、註釋、根節點等。

XPath 的路徑表達式是一種類似於文件路徑的語法,可以通過“/”和“//”來選取節點。單斜杠“/”表示選取根節點,雙斜杠“//”表示選取任意位置的節點。例如,“/bookstore/book”表示選取根節點 bookstore 下的所有 book 子節點,“//title”表示選取任意位置的 title 節點。

XPath 還可以使用謂語(Predicate)來過濾節點。謂語是被嵌在方括號中的表達式,它可以是一個數字、一個比較運算符或一個函數調用。例如,“/bookstore/book[1]”表示選取 bookstore 的第一個子節點 book,“//book[@lang]”表示選取所有具有 lang 屬性的 book 節點。

XPath 的函數包括字符串、數學、邏輯、節點、序列等函數,這些函數可以用於選取節點、計算值、轉換數據類型等操作。例如,“string-length(string)”函數可以返回字符串的長度,“count(node-set)”函數可以返回節點集中節點的個數。

下面我們通過一個例子來說明如何使用 XPath 對頁面進行解析。假設我們有如下的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book>
      <title lang="eng">Harry Potter</title>
      <price>29.99</price>
    </book>
    <book>
      <title lang="zh">Learning XML</title>
      <price>39.95</price>
    </book>
</bookstore>

對於這個 XML 文件,我們可以用如下所示的 XPath 語法獲取文檔中的節點。

路徑表達式 結果
/bookstore 選取根元素 bookstore。註意:假如路徑起始於正斜杠( / ),則此路徑始終代表到某元素的絕對路徑!
//book 選取所有 book 子元素,而不管它們在文檔中的位置。
//@lang 選取名為 lang 的所有屬性。
/bookstore/book[1] 選取 bookstore 的第一個子節點 book。

CSS 選擇器解析

CSS 選擇器是一種基於 HTML 標簽的屬性和關系來定位元素的方法。它可以根據 HTML 標簽的層次結構、類名、id 等屬性來定位元素。在 Python 中,我們可以使用 BeautifulSoup 庫來進行 CSS 選擇器解析。

下面我們通過一個例子來說明如何使用 CSS 選擇器對頁面進行解析。假設我們有如下的 HTML 代碼:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>這是頁面標題</title>
</head>
<body>
	<div class="content">
		<h1>這是一級標題</h1>
		<p>這是一段文本</p>
	</div>
	<div class="footer">
		<p>版權所有 © 2021</p>
	</div>
</body>
</html>

我們可以使用如下所示的 CSS 選擇器語法來選取頁面元素。

選擇器 結果
div.content 選取 class 為 content 的 div 元素。
h1 選取所有的 h1 元素。
div.footer p 選取 class 為 footer 的 div 元素下的所有 p 元素。
[href] 選取所有具有 href 屬性的元素。

正則表達式解析

正則表達式是一種用來匹配、查找和替換文本的工具,它可以用於對 HTML 頁面進行解析。在 Python 中,我們可以使用 re 模塊來進行正則表達式解析。

下面我們通過一個例子來說明如何使用正則表達式對頁面進行解析。假設我們有如下的 HTML 代碼:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>這是頁面標題</title>
</head>
<body>
	<div class="content">
		<h1>這是一級標題</h1>
		<p>這是一段文本</p>
	</div>
	<div class="footer">
		<p>版權所有 © 2021</p>
	</div>
</body>
</html>

我們可以使用如下所示的正則表達式來選取頁面元素。

import re
html = '''
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>這是頁面標題</title>
</head>
<body>
	<div class="content">
		<h1>這是一級標題</h1>
		<p>這是一段文本</p>
	</div>
	<div class="footer">
		<p>版權所有 © 2021</p>
	</div>
</body>
</html>
'''
pattern = re.compile(r'<div class="content">.*?<h1>(.*?)</h1>.*?<p>(.*?)</p>.*?</div>', re.S)
match = re.search(pattern, html)
if match:
    title = match.group(1)
    text = match.group(2)
    print(title)
    print(text)

以上代碼中,我們使用 re 模塊的 compile 方法來編譯正則表達式,然後使用 search 方法來匹配 HTML 代碼。在正則表達式中,“.*?”表示非貪婪匹配,也就是匹配到第一個符合條件的標簽就停止匹配,而“re.S”表示讓“.”可以匹配包括換行符在內的任意字符。最後,我們使用 group 方法來獲取匹配的結果。

總結

本文介紹瞭 Python 中常用的三種 HTML 解析方式:XPath 解析、CSS 選擇器解析和正則表達式解析。在具體的應用過程中,我們可以根據需要選擇不同的解析方式。XPath 解析適用於對 HTML 頁面的層次結構進行解析,能夠比較方便地定位頁面元素;CSS 選擇器解析適用於對 HTML 頁面的類名、id 等屬性進行解析,可以快速定位元素;正則表達式解析適用於對 HTML 頁面的標簽和文本進行解析,可以靈活地處理頁面元素。希望本文能夠對大傢進行 HTML 解析方面的學習和實踐有所幫助。

到此這篇關於Python爬蟲之解析HTML頁面詳解的文章就介紹到這瞭,更多相關Python解析HTML內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: