(.*?)
.*?(.*?)
.*?我們通常需要解析網路爬取的頁面,以取得我們需要的資料。透過分析 HTML 標籤的組合結構,我們可以提取出網頁中所包含的有用資訊。在 Python 中,有三種常見的 HTML 解析方式:正規表示式解析、XPath 解析和 CSS 選擇器解析。
了解 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 是在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 子元素,而不管它們在文件中的位置。 | |
選取名為 lang 的所有屬性。 |
通过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中文網其他相關文章!