首頁 > 後端開發 > Python教學 > Python爬蟲之怎麼解析HTML頁面

Python爬蟲之怎麼解析HTML頁面

WBOY
發布: 2023-05-30 21:41:42
轉載
2971 人瀏覽過

用Python解析HTML頁面

我們通常需要解析網路爬取的頁面,以取得我們需要的資料。透過分析 HTML 標籤的組合結構,我們可以提取出網頁中所包含的有用資訊。在 Python 中,有三種常見的 HTML 解析方式:正規表示式解析、XPath 解析和 CSS 選擇器解析。

HTML 頁面的結構

了解 HTML 頁面的基本結構是在講解 HTML 解析方式之前的先決條件。當我們在瀏覽器中開啟一個網站,並透過滑鼠右鍵選單選擇「顯示網頁原始碼」選單項目時,就可以看到網頁對應的 HTML 程式碼。 HTML 程式碼通常由標籤、屬性和文字組成。標籤承載頁面顯示的內容,屬性補充標籤訊息,而文字則是標籤所顯示的內容。下面是一個簡單的HTML 頁面程式碼結構範例:

<!DOCTYPE html>
<html>
    <head>
        <!-- head 标签中的内容不会在浏览器窗口中显示 -->
        <title>这是页面标题</title>
    </head>
    <body>
        <!-- body 标签中的内容会在浏览器窗口中显示 -->
        <h2>这是一级标题</h2>
        <p>这是一段文本</p>
    </body>
</html>
登入後複製

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

<!DOCTYPE html>
<html>
    <head>
        <!-- 页面的元信息,如字符编码、标题、关键字、媒体查询等 -->
    </head>
    <body>
        <!-- 页面的主体,显示在浏览器窗口中的内容 -->
    </body>
</html>
登入後複製

標籤、層疊樣式表(CSS)和 JavaScript 是構成 HTML 頁面的三個基本組成部分。標籤用來承載頁面要顯示的內容,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 語法取得文件中的節點。

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

CSS 选择器解析

通过HTML标签的属性和关系来定位元素的方式被称为CSS选择器。根据 HTML 标签的层级结构、类名、id 等属性能够确定元素的位置。在 Python 中,我们可以使用 BeautifulSoup 库来进行 CSS 选择器解析。

我们接下来会举一个例子,讲解如何运用 CSS 选择器来分析页面。假设我们有如下的 HTML 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>
登入後複製
登入後複製

我们可以使用如下所示的 CSS 选择器语法来选取页面元素。

选择器结果
div.content选取 class 为 content 的 div 元素。
h2选取所有的 h2 元素。
div.footer p选取 class 为 footer 的 div 元素下的所有 p 元素。
[href]选取所有具有 href 属性的元素。

正则表达式解析

用正则表达式可以解析 HTML 页面,从而实现文本的匹配、查找和替换。使用 re 模块可以进行 Python 的正则表达式解析。

下面我们通过一个例子来说明如何使用正则表达式对页面进行解析。假设我们有如下的 HTML 代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>这是页面标题</title>
</head>
<body>
	<div class="content">
		<h2>这是一级标题</h2>
		<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">
		<h2>这是一级标题</h2>
		<p>这是一段文本</p>
	</div>
	<div class="footer">
		<p>版权所有 © 2021</p>
	</div>
</body>
</html>
'''
pattern = re.compile(r'
.*?

(.*?)

.*?

(.*?)

.*?
', 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頁面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板