您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“Python爬蟲之怎么解析HTML頁面”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“Python爬蟲之怎么解析HTML頁面”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習新知識吧。
在網(wǎng)絡(luò)爬取的過程中,我們通常需要對所爬取的頁面進行解析,從中提取我們需要的數(shù)據(jù)。網(wǎng)頁的結(jié)構(gòu)通常是由 HTML 標簽所組成的,通過對這些標簽的解析,可以得到網(wǎng)頁中所包含的有用信息。在 Python 中,有三種常見的 HTML 解析方式:正則表達式解析、XPath 解析和 CSS 選擇器解析。
在講解 HTML 解析方式之前,我們需要先了解一下 HTML 頁面的基本結(jié)構(gòu)。當我們在瀏覽器中打開一個網(wǎng)站,并通過鼠標右鍵菜單選擇“顯示網(wǎng)頁源代碼”菜單項時,就可以看到網(wǎng)頁對應(yīng)的 HTML 代碼。HTML 代碼通常由標簽、屬性和文本組成。標簽用于承載頁面要顯示的內(nèi)容,屬性用于補充標簽的信息,而文本則是標簽所顯示的內(nèi)容。下面是一個簡單的 HTML 頁面代碼結(jié)構(gòu)示例:
<!DOCTYPE html> <html> <head> <!-- head 標簽中的內(nèi)容不會在瀏覽器窗口中顯示 --> <title>這是頁面標題</title> </head> <body> <!-- body 標簽中的內(nèi)容會在瀏覽器窗口中顯示 --> <h2>這是一級標題</h2> <p>這是一段文本</p> </body> </html>
在這個 HTML 頁面代碼示例中,<!DOCTYPE html>
是文檔類型聲明,<html>
標簽是整個頁面的根標簽,<head>
和<body>
是<html>
標簽的子標簽,放在<body>
標簽下的內(nèi)容會顯示在瀏覽器窗口中,這部分內(nèi)容是網(wǎng)頁的主體;放在<head>
標簽下的內(nèi)容不會在瀏覽器窗口中顯示,但是卻包含了頁面重要的元信息,通常稱之為網(wǎng)頁的頭部。HTML 頁面大致的代碼結(jié)構(gòu)如下所示:
<!DOCTYPE html> <html> <head> <!-- 頁面的元信息,如字符編碼、標題、關(guān)鍵字、媒體查詢等 --> </head> <body> <!-- 頁面的主體,顯示在瀏覽器窗口中的內(nèi)容 --> </body> </html>
在 HTML 頁面中,標簽、層疊樣式表(CSS)和 JavaScript 是構(gòu)成頁面的三要素。標簽用來承載頁面要顯示的內(nèi)容,CSS 負責對頁面的渲染,而 JavaScript 用來控制頁面的交互式行為。要實現(xiàn) HTML 頁面的解析,可以使用 XPath 的語法,它原本是 XML 的一種查詢語法,可以根據(jù) HTML 標簽的層次結(jié)構(gòu)提取標簽中的內(nèi)容或標簽屬性;此外,也可以使用 CSS 選擇器來定位頁面元素,就跟用 CSS 渲染頁面元素是同樣的道理。
XPath 是在 XML(eXtensible Markup Language)文檔中查找信息的一種語法,XML 跟 HTML 類似也是一種用標簽承載數(shù)據(jù)的標簽語言,不同之處在于 XML 的標簽是可擴展的,可以自定義的,而且 XML 對語法有更嚴格的要求。XPath 使用路徑表達式來選取 XML 文檔中的節(jié)點或者節(jié)點集,這里所說的節(jié)點包括元素、屬性、文本、命名空間、處理指令、注釋、根節(jié)點等。
XPath 的路徑表達式是一種類似于文件路徑的語法,可以通過“/”和“//”來選取節(jié)點。單斜杠“/”表示選取根節(jié)點,雙斜杠“//”表示選取任意位置的節(jié)點。例如,“/bookstore/book”表示選取根節(jié)點 bookstore 下的所有 book 子節(jié)點,“//title”表示選取任意位置的 title 節(jié)點。
XPath 還可以使用謂語(Predicate)來過濾節(jié)點。謂語是被嵌在方括號中的表達式,它可以是一個數(shù)字、一個比較運算符或一個函數(shù)調(diào)用。例如,“/bookstore/book[1]”表示選取 bookstore 的第一個子節(jié)點 book,“//book[@lang]”表示選取所有具有 lang 屬性的 book 節(jié)點。
XPath 的函數(shù)包括字符串、數(shù)學(xué)、邏輯、節(jié)點、序列等函數(shù),這些函數(shù)可以用于選取節(jié)點、計算值、轉(zhuǎn)換數(shù)據(jù)類型等操作。例如,“string-length(string)”函數(shù)可以返回字符串的長度,“count(node-set)”函數(shù)可以返回節(jié)點集中節(jié)點的個數(shù)。
下面我們通過一個例子來說明如何使用 XPath 對頁面進行解析。假設(shè)我們有如下的 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 語法獲取文檔中的節(jié)點。
路徑表達式 | 結(jié)果 |
---|---|
/bookstore | 選取根元素 bookstore。注意:假如路徑起始于正斜杠( / ),則此路徑始終代表到某元素的絕對路徑! |
//book | 選取所有 book 子元素,而不管它們在文檔中的位置。 |
//@lang | 選取名為 lang 的所有屬性。 |
/bookstore/book[1] | 選取 bookstore 的第一個子節(jié)點 book。 |
CSS 選擇器是一種基于 HTML 標簽的屬性和關(guān)系來定位元素的方法。它可以根據(jù) HTML 標簽的層次結(jié)構(gòu)、類名、id 等屬性來定位元素。在 Python 中,我們可以使用 BeautifulSoup 庫來進行 CSS 選擇器解析。
下面我們通過一個例子來說明如何使用 CSS 選擇器對頁面進行解析。假設(shè)我們有如下的 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>版權(quán)所有 ? 2021</p> </div> </body> </html>
我們可以使用如下所示的 CSS 選擇器語法來選取頁面元素。
選擇器 | 結(jié)果 |
---|---|
div.content | 選取 class 為 content 的 div 元素。 |
h2 | 選取所有的 h2 元素。 |
div.footer p | 選取 class 為 footer 的 div 元素下的所有 p 元素。 |
[href] | 選取所有具有 href 屬性的元素。 |
正則表達式是一種用來匹配、查找和替換文本的工具,它可以用于對 HTML 頁面進行解析。在 Python 中,我們可以使用 re 模塊來進行正則表達式解析。
下面我們通過一個例子來說明如何使用正則表達式對頁面進行解析。假設(shè)我們有如下的 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>版權(quán)所有 ? 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>版權(quán)所有 ? 2021</p> </div> </body> </html> ''' pattern = re.compile(r'<div class="content">.*?<h2>(.*?)</h2>.*?<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”表示讓“.”可以匹配包括換行符在內(nèi)的任意字符。最后,我們使用 group 方法來獲取匹配的結(jié)果。
讀到這里,這篇“Python爬蟲之怎么解析HTML頁面”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。