您的位置:首頁>正文

只要你會中文!看完這篇爬蟲入門文章!你就能入門爬蟲!童叟無欺

二、流覽網頁的過程

抓取網頁的過程其實和讀者平時使用IE流覽器流覽網頁的道理是一樣的。

比如說你在流覽器的位址欄中輸入 www.baidu.com 這個位址。

打開網頁的過程其實就是流覽器作為一個流覽的“用戶端”, 向伺服器端發送了 一次請求, 把伺服器端的檔“抓”到本地, 再進行解釋、展現。

HTML是一種標記語言, 用標籤標記內容並加以解析和區分。

流覽器的功能是將獲取到的HTML代碼進行解析, 然後將原始的代碼轉變成我們直接看到的網站頁面。 如果你也是程式設計的學習者或者已經學會了的程式設計者!小編這裡有個群:103456743!大家可以加下, 裡面遍佈了全國各地的學習者!為大家提供一個交流平臺, 不管平時有碰到什麼BUG或者學習過程中卡殼, 找不到人替你解決?那麼就進來吧, 裡面熱心的小夥伴還是非常多的, 管理也是挺好的, 有什麼問題, 他如果有時間都能給大家解決,

我覺得是一個非常不錯的交流平臺, 沒事也可以和大家扯扯公司的事學校發生的趣事, 群檔已經上傳了好多G的資料, PDF, 視頻 安裝工具, 安裝教程都是有的, 為了大家的學習能更進一步!也為了大家能愉快的交流, 討論學術問題!所以你還在等什麼呢?好了馬上給大家帶來正文!

四、URL的理解和舉例

URL是URI的一個子集。 它是Uniform Resource Locator的縮寫, 譯為“統一資源定位 符”。

通俗地說, URL是Internet上描述資訊資源的字串, 主要用在各種WWW客戶程式和伺服器程式上。

採用URL可以用一種統一的格式來描述各種資訊資源, 包括檔、伺服器的位址和目錄等。

URL的格式由三部分組成:

①第一部分是協定(或稱為服務方式)。

②第二部分是存有該資源的主機IP位址(有時也包括埠號)。

③第三部分是主機資源的具體位址, 如目錄和檔案名等。

第一部分和第二部分用“://”符號隔開,

第二部分和第三部分用“/”符號隔開。

第一部分和第二部分是不可缺少的, 第三部分有時可以省略。

爬蟲最主要的處理物件就是URL, 它根據URL位址取得所需要的檔內容, 然後對它 進行進一步的處理。

因此, 準確地理解URL對理解網路爬蟲至關重要

[Python]網路爬蟲(二):利用urllib2通過指定的URL抓取網頁內容

按下F5可以看到運行的結果:

我們可以打開百度主頁,右擊,選擇查看原始程式碼(火狐OR穀歌流覽器均可),會發現也是完全一樣的內容。

也就是說,上面這四行代碼將我們訪問百度時流覽器收到的代碼們全部列印了出來。

這就是一個最簡單的urllib2的例子。

除了"http:",URL同樣可以使用"ftp:","file:"等等來替代。

HTTP是基於請求和應答機制的:

用戶端提出請求,服務端提供應答。

在HTTP中,這個經常使用熟知的POST請求發送。

這個通常在你提交一個HTML表單時由你的流覽器來做。

並不是所有的POSTs都來源於表單,你能夠使用POST提交任意的資料到你自己的程式。

一般的HTML表單,data需要編碼成標準形式。然後做為data參數傳到Request物件。

編碼工作使用urllib的函數而非urllib2。

我們新建一個檔urllib2_test03.py來感受一下:

這樣就實現了Data資料的Get傳送。

2.設置Headers到http請求

有一些網站不喜歡被程式(非人為訪問)訪問,或者發送不同版本的內容到不同的流覽器。

默認的urllib2把自己作為“Python-urllib/x.y”(x和y是Python主版本和次版本號,例如Python-urllib/2.7),

這個身份可能會讓網站迷惑,或者乾脆不工作。

流覽器確認自己身份是通過User-Agent頭,當你創建了一個請求物件,你可以給他一個包含頭資料的字典。

下面的例子發送跟上面一樣的內容,但把自身類比成Internet Explorer。

2.HTTPError

伺服器上每一個HTTP 應答物件response包含一個數位"狀態碼"。

有時狀態碼指出伺服器無法完成請求。默認的處理器會為你處理一部分這種應答。

例如:假如response是一個"重定向",需要用戶端從別的位址獲取文檔,urllib2將為你處理。

其他不能處理的,urlopen會產生一個HTTPError。

典型的錯誤包含"404"(頁面無法找到),"403"(請求禁止),和"401"(帶驗證請求)。

HTTP狀態碼表示HTTP協定所返回的回應的狀態。

比如用戶端向伺服器發送請求,如果成功地獲得請求的資源,則返回的狀態碼為200,表示回應成功。

如果請求的資源不存在, 則通常返回404錯誤。

HTTP狀態碼通常分為5種類型,分別以1~5五個數位開頭,由3位元整數組成:

HTTPError實例產生後會有一個整型'code'屬性,是伺服器發送的相關錯誤號。

Error Codes錯誤碼

因為預設的處理器處理了重定向(300以外號碼),並且100-299範圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。

BaseHTTPServer.BaseHTTPRequestHandler.response是一個很有用的應答號碼字典,顯示了HTTP協定使用的所有的應答號。

當一個錯誤號產生後,伺服器返回一個HTTP錯誤號,和一個錯誤頁面。

你可以使用HTTPError實例作為頁面返回的應答物件response。

這表示和錯誤屬性一樣,它同樣包含了read,geturl,和info方法。

我們建一個urllib2_test07.py來感受一下:

按下F5可以看見輸出了404的錯誤碼,也就說沒有找到這個頁面。

3.Wrapping

所以如果你想為HTTPError或URLError做準備,將有兩個基本的辦法。推薦使用第二種。

我們建一個urllib2_test08.py來示範一下第一種異常處理的方案:

如果你希望用特定處理器獲取URLs你會想創建一個openers,例如獲取一個能處理cookie的opener,或者獲取一個不重定向的opener。

要創建一個 opener,可以產生實體一個OpenerDirector,

然後調用.add_handler(some_handler_instance)。

同樣,可以使用build_opener,這是一個更加方便的函數,用來創建opener物件,他只需要一次函式呼叫。

build_opener默認添加幾個處理器,但提供快捷的方法來添加或更新默認處理器。

其他的處理器handlers你或許會希望處理代理,驗證,和其他常用但有點特殊的情況。

install_opener 用來創建(全域)默認opener。這個表示調用urlopen將使用你安裝的opener。

Opener物件有一個open方法。

該方法可以像urlopen函數那樣直接用來獲取urls:通常不必調用install_opener,除了為了方便。

說完了上面兩個內容,下面我們來看一下基本認證的內容,這裡會用到上面提及的Opener和Handler。

Basic Authentication 基本驗證

為了展示創建和安裝一個handler,我們將使用HTTPBasicAuthHandler。

當需要基礎驗證時,伺服器發送一個header(401錯誤碼) 請求驗證。這個指定了scheme 和一個‘realm’,看起來像這樣:Www-authenticate: SCHEME realm="REALM".

例如

Www-authenticate: Basic realm="cPanel Users"

用戶端必須使用新的請求,並在請求頭裡包含正確的姓名和密碼。

這是“基礎驗證”,為了簡化這個過程,我們可以創建一個HTTPBasicAuthHandler的實例,並讓opener使用這個handler就可以啦。

HTTPBasicAuthHandler使用一個密碼管理的物件來處理URLs和realms來映射用戶名和密碼。

如果你知道realm(從伺服器發送來的頭裡)是什麼,你就能使用HTTPPasswordMgr。

通常人們不關心realm是什麼。那樣的話,就能用方便的HTTPPasswordMgrWithDefaultRealm。

這個將在你為URL指定一個預設的用戶名和密碼。

這將在你為特定realm提供一個其他組合時得到提供。

我們通過給realm參數指定None提供給add_password來指示這種情況。

最高層次的URL是第一個要求驗證的URL。你傳給.add_password()更深層次的URLs將同樣合適。

說了這麼多廢話,下面來用一個例子演示一下上面說到的內容。

我們建一個urllib2_test12.py來測試一下info的應用:

HTTPBasicAuthHandler使用一個密碼管理的物件來處理URLs和realms來映射用戶名和密碼。

如果你知道realm(從伺服器發送來的頭裡)是什麼,你就能使用HTTPPasswordMgr。

通常人們不關心realm是什麼。那樣的話,就能用方便的HTTPPasswordMgrWithDefaultRealm。

這個將在你為URL指定一個預設的用戶名和密碼。

這將在你為特定realm提供一個其他組合時得到提供。

我們通過給realm參數指定None提供給add_password來指示這種情況。

最高層次的URL是第一個要求驗證的URL。你傳給.add_password()更深層次的URLs將同樣合適。

說了這麼多廢話,下面來用一個例子演示一下上面說到的內容。

我們建一個urllib2_test12.py來測試一下info的應用:

這樣就可以看到傳輸的資料包內容了:

9.表單的處理

登錄必要填表,表單怎麼填?

首先利用工具截取所要填表的內容。

比如我一般用firefox+httpfox外掛程式來看看自己到底發送了些什麼包。

以verycd為例,先找到自己發的POST請求,以及POST表單項。

可以看到verycd的話需要填username,password,continueURI,fk,login_submit這幾項,其中fk是隨機生成的(其實不太隨機,看上去像是把epoch時間經過簡單的編碼生成的),需要從網頁獲取,也就是說得先訪問一次網頁,用規則運算式等工具截取返回資料中的fk項。continueURI顧名思義可以隨便寫,login_submit是固定的,這從源碼可以看出。還有username,password那就很顯然了:

實戰

一個簡單的百度貼吧的小爬蟲

接下來準備用糗百做一個爬蟲的小例子。

但是在這之前,先詳細的整理一下Python中的規則運算式的相關內容。

規則運算式在Python爬蟲中的作用就像是老師點名時用的花名冊一樣,是必不可少的神兵利器。

一、 規則運算式基礎

1.1.概念介紹

規則運算式是用於處理字串的強大工具,它並不是Python的一部分。

其他程式設計語言中也有規則運算式的概念,區別只在於不同的程式設計語言實現支援的語法數量不同。

它擁有自己獨特的語法以及一個獨立的處理引擎,在提供了規則運算式的語言裡,規則運算式的語法都是一樣的。

下圖展示了使用規則運算式進行匹配的流程:

規則運算式的大致匹配過程是:

1.依次拿出運算式和文本中的字元比較,

2.如果每一個字元都能匹配,則匹配成功;一旦有匹配不成功的字元則匹配失敗。

3.如果運算式中有量詞或邊界,這個過程會稍微有一些不同。

下圖列出了Python支援的規則運算式元字元和語法:

1.2. 數量詞的貪婪模式與非貪婪模式

規則運算式通常用於在文本中查找匹配的字串。

貪婪模式,總是嘗試匹配盡可能多的字元;

非貪婪模式則相反,總是嘗試匹配盡可能少的字元。

Python裡數量詞默認是貪婪的。

例如:規則運算式"ab*"如果用於查找"abbbc",將找到"abbb"。

而如果使用非貪婪的數量詞"ab*?",將找到"a"。

可以看到控制台輸出了匹配的三個結果:

下面來具體看看代碼中的關鍵方法。

★ re.compile(strPattern[, flag]):

這個方法是Pattern類的工廠方法,用於將字串形式的規則運算式編譯為Pattern物件。

第二個參數flag是匹配模式,取值可以使用按位或運算子'|'表示同時生效,比如re.I | re.M。

另外,你也可以在regex字串中指定模式,

比如re.compile('pattern', re.I | re.M)與re.compile('(?im)pattern')是等價的。

可選值有:

re.I(全拼:IGNORECASE): 忽略大小寫(括弧內是完整寫法,下同)

re.M(全拼:MULTILINE): 多行模式,改變'^'和'$'的行為(參見上圖)

re.S(全拼:DOTALL): 點任意匹配模式,改變'.'的行為

re.L(全拼:LOCALE): 使預定字元類 w W  B s S 取決於當前區域設定

re.U(全拼:UNICODE): 使預定字元類 w W  B s S d D 取決於unicode定義的字元屬性

re.X(全拼:VERBOSE): 詳細模式。這個模式下規則運算式可以是多行,忽略空白字元,並可以加入注釋。

group([group1, …]):

獲得一個或多個分組截獲的字串;指定多個參數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數時,返回group(0);沒有截獲字串的組返回None;截獲了多次的組返回最後一次截獲的子串。

groups([default]):

以元組形式返回全部分組截獲的字串。相當於調用group(1,2,…last)。default表示沒有截獲字串的組以這個值替代,默認為None。

groupdict([default]):

返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。

start([group]):

返回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。

end([group]):

返回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。

span([group]):

返回(start(group), end(group))。

expand(template):

將匹配到的分組代入template中然後返回。template中可以使用id或g、g引用分組,但不能使用編號0。id與g是等價的;但將被認為是第10個分組,如果你想表達之後是字元'0',只能使用g<1>0。

下面來用一個py實例輸出所有的內容加深理解:

2.3. Pattern

Pattern物件是一個編譯好的規則運算式,通過Pattern提供的一系列方法可以對文本進行匹配查找。

Pattern不能直接產生實體,必須使用re.compile()進行構造,也就是re.compile()返回的對象。

Pattern提供了幾個可讀屬性用於獲取運算式的相關資訊:

pattern: 編譯時用的運算式字串。

flags: 編譯時用的匹配模式。數位形式。

groups: 運算式中分組的數量。

groupindex: 以運算式中有別名的組的別名為鍵、以該組對應的編號為值的字典,沒有別名的組不包含在內。

可以用下面這個例子查看pattern的屬性:

match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none

例如:

print(re.match(‘super’, ‘superstition’).span())

會返回(0, 5)

print(re.match(‘super’, ‘insuperable’))

則返回None

search()會掃描整個字串並返回第一個成功的匹配

例如:

print(re.search(‘super’, ‘superstition’).span())

返回(0, 5)

print(re.search(‘super’, ‘insuperable’).span())

返回(2, 7)

看一個search的實例:

7.subn

subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):

返回 (sub(repl, string[, count]), 替換次數)。

同樣,正文部分用div和class綜合標記,接下來要做的只是用規則運算式來匹配即可。

運行截圖:

生成的txt檔:

謝謝閱讀!

如有侵權請聯繫小編刪除!

我們可以打開百度主頁,右擊,選擇查看原始程式碼(火狐OR穀歌流覽器均可),會發現也是完全一樣的內容。

也就是說,上面這四行代碼將我們訪問百度時流覽器收到的代碼們全部列印了出來。

這就是一個最簡單的urllib2的例子。

除了"http:",URL同樣可以使用"ftp:","file:"等等來替代。

HTTP是基於請求和應答機制的:

用戶端提出請求,服務端提供應答。

在HTTP中,這個經常使用熟知的POST請求發送。

這個通常在你提交一個HTML表單時由你的流覽器來做。

並不是所有的POSTs都來源於表單,你能夠使用POST提交任意的資料到你自己的程式。

一般的HTML表單,data需要編碼成標準形式。然後做為data參數傳到Request物件。

編碼工作使用urllib的函數而非urllib2。

我們新建一個檔urllib2_test03.py來感受一下:

這樣就實現了Data資料的Get傳送。

2.設置Headers到http請求

有一些網站不喜歡被程式(非人為訪問)訪問,或者發送不同版本的內容到不同的流覽器。

默認的urllib2把自己作為“Python-urllib/x.y”(x和y是Python主版本和次版本號,例如Python-urllib/2.7),

這個身份可能會讓網站迷惑,或者乾脆不工作。

流覽器確認自己身份是通過User-Agent頭,當你創建了一個請求物件,你可以給他一個包含頭資料的字典。

下面的例子發送跟上面一樣的內容,但把自身類比成Internet Explorer。

2.HTTPError

伺服器上每一個HTTP 應答物件response包含一個數位"狀態碼"。

有時狀態碼指出伺服器無法完成請求。默認的處理器會為你處理一部分這種應答。

例如:假如response是一個"重定向",需要用戶端從別的位址獲取文檔,urllib2將為你處理。

其他不能處理的,urlopen會產生一個HTTPError。

典型的錯誤包含"404"(頁面無法找到),"403"(請求禁止),和"401"(帶驗證請求)。

HTTP狀態碼表示HTTP協定所返回的回應的狀態。

比如用戶端向伺服器發送請求,如果成功地獲得請求的資源,則返回的狀態碼為200,表示回應成功。

如果請求的資源不存在, 則通常返回404錯誤。

HTTP狀態碼通常分為5種類型,分別以1~5五個數位開頭,由3位元整數組成:

HTTPError實例產生後會有一個整型'code'屬性,是伺服器發送的相關錯誤號。

Error Codes錯誤碼

因為預設的處理器處理了重定向(300以外號碼),並且100-299範圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。

BaseHTTPServer.BaseHTTPRequestHandler.response是一個很有用的應答號碼字典,顯示了HTTP協定使用的所有的應答號。

當一個錯誤號產生後,伺服器返回一個HTTP錯誤號,和一個錯誤頁面。

你可以使用HTTPError實例作為頁面返回的應答物件response。

這表示和錯誤屬性一樣,它同樣包含了read,geturl,和info方法。

我們建一個urllib2_test07.py來感受一下:

按下F5可以看見輸出了404的錯誤碼,也就說沒有找到這個頁面。

3.Wrapping

所以如果你想為HTTPError或URLError做準備,將有兩個基本的辦法。推薦使用第二種。

我們建一個urllib2_test08.py來示範一下第一種異常處理的方案:

如果你希望用特定處理器獲取URLs你會想創建一個openers,例如獲取一個能處理cookie的opener,或者獲取一個不重定向的opener。

要創建一個 opener,可以產生實體一個OpenerDirector,

然後調用.add_handler(some_handler_instance)。

同樣,可以使用build_opener,這是一個更加方便的函數,用來創建opener物件,他只需要一次函式呼叫。

build_opener默認添加幾個處理器,但提供快捷的方法來添加或更新默認處理器。

其他的處理器handlers你或許會希望處理代理,驗證,和其他常用但有點特殊的情況。

install_opener 用來創建(全域)默認opener。這個表示調用urlopen將使用你安裝的opener。

Opener物件有一個open方法。

該方法可以像urlopen函數那樣直接用來獲取urls:通常不必調用install_opener,除了為了方便。

說完了上面兩個內容,下面我們來看一下基本認證的內容,這裡會用到上面提及的Opener和Handler。

Basic Authentication 基本驗證

為了展示創建和安裝一個handler,我們將使用HTTPBasicAuthHandler。

當需要基礎驗證時,伺服器發送一個header(401錯誤碼) 請求驗證。這個指定了scheme 和一個‘realm’,看起來像這樣:Www-authenticate: SCHEME realm="REALM".

例如

Www-authenticate: Basic realm="cPanel Users"

用戶端必須使用新的請求,並在請求頭裡包含正確的姓名和密碼。

這是“基礎驗證”,為了簡化這個過程,我們可以創建一個HTTPBasicAuthHandler的實例,並讓opener使用這個handler就可以啦。

HTTPBasicAuthHandler使用一個密碼管理的物件來處理URLs和realms來映射用戶名和密碼。

如果你知道realm(從伺服器發送來的頭裡)是什麼,你就能使用HTTPPasswordMgr。

通常人們不關心realm是什麼。那樣的話,就能用方便的HTTPPasswordMgrWithDefaultRealm。

這個將在你為URL指定一個預設的用戶名和密碼。

這將在你為特定realm提供一個其他組合時得到提供。

我們通過給realm參數指定None提供給add_password來指示這種情況。

最高層次的URL是第一個要求驗證的URL。你傳給.add_password()更深層次的URLs將同樣合適。

說了這麼多廢話,下面來用一個例子演示一下上面說到的內容。

我們建一個urllib2_test12.py來測試一下info的應用:

HTTPBasicAuthHandler使用一個密碼管理的物件來處理URLs和realms來映射用戶名和密碼。

如果你知道realm(從伺服器發送來的頭裡)是什麼,你就能使用HTTPPasswordMgr。

通常人們不關心realm是什麼。那樣的話,就能用方便的HTTPPasswordMgrWithDefaultRealm。

這個將在你為URL指定一個預設的用戶名和密碼。

這將在你為特定realm提供一個其他組合時得到提供。

我們通過給realm參數指定None提供給add_password來指示這種情況。

最高層次的URL是第一個要求驗證的URL。你傳給.add_password()更深層次的URLs將同樣合適。

說了這麼多廢話,下面來用一個例子演示一下上面說到的內容。

我們建一個urllib2_test12.py來測試一下info的應用:

這樣就可以看到傳輸的資料包內容了:

9.表單的處理

登錄必要填表,表單怎麼填?

首先利用工具截取所要填表的內容。

比如我一般用firefox+httpfox外掛程式來看看自己到底發送了些什麼包。

以verycd為例,先找到自己發的POST請求,以及POST表單項。

可以看到verycd的話需要填username,password,continueURI,fk,login_submit這幾項,其中fk是隨機生成的(其實不太隨機,看上去像是把epoch時間經過簡單的編碼生成的),需要從網頁獲取,也就是說得先訪問一次網頁,用規則運算式等工具截取返回資料中的fk項。continueURI顧名思義可以隨便寫,login_submit是固定的,這從源碼可以看出。還有username,password那就很顯然了:

實戰

一個簡單的百度貼吧的小爬蟲

接下來準備用糗百做一個爬蟲的小例子。

但是在這之前,先詳細的整理一下Python中的規則運算式的相關內容。

規則運算式在Python爬蟲中的作用就像是老師點名時用的花名冊一樣,是必不可少的神兵利器。

一、 規則運算式基礎

1.1.概念介紹

規則運算式是用於處理字串的強大工具,它並不是Python的一部分。

其他程式設計語言中也有規則運算式的概念,區別只在於不同的程式設計語言實現支援的語法數量不同。

它擁有自己獨特的語法以及一個獨立的處理引擎,在提供了規則運算式的語言裡,規則運算式的語法都是一樣的。

下圖展示了使用規則運算式進行匹配的流程:

規則運算式的大致匹配過程是:

1.依次拿出運算式和文本中的字元比較,

2.如果每一個字元都能匹配,則匹配成功;一旦有匹配不成功的字元則匹配失敗。

3.如果運算式中有量詞或邊界,這個過程會稍微有一些不同。

下圖列出了Python支援的規則運算式元字元和語法:

1.2. 數量詞的貪婪模式與非貪婪模式

規則運算式通常用於在文本中查找匹配的字串。

貪婪模式,總是嘗試匹配盡可能多的字元;

非貪婪模式則相反,總是嘗試匹配盡可能少的字元。

Python裡數量詞默認是貪婪的。

例如:規則運算式"ab*"如果用於查找"abbbc",將找到"abbb"。

而如果使用非貪婪的數量詞"ab*?",將找到"a"。

可以看到控制台輸出了匹配的三個結果:

下面來具體看看代碼中的關鍵方法。

★ re.compile(strPattern[, flag]):

這個方法是Pattern類的工廠方法,用於將字串形式的規則運算式編譯為Pattern物件。

第二個參數flag是匹配模式,取值可以使用按位或運算子'|'表示同時生效,比如re.I | re.M。

另外,你也可以在regex字串中指定模式,

比如re.compile('pattern', re.I | re.M)與re.compile('(?im)pattern')是等價的。

可選值有:

re.I(全拼:IGNORECASE): 忽略大小寫(括弧內是完整寫法,下同)

re.M(全拼:MULTILINE): 多行模式,改變'^'和'$'的行為(參見上圖)

re.S(全拼:DOTALL): 點任意匹配模式,改變'.'的行為

re.L(全拼:LOCALE): 使預定字元類 w W  B s S 取決於當前區域設定

re.U(全拼:UNICODE): 使預定字元類 w W  B s S d D 取決於unicode定義的字元屬性

re.X(全拼:VERBOSE): 詳細模式。這個模式下規則運算式可以是多行,忽略空白字元,並可以加入注釋。

group([group1, …]):

獲得一個或多個分組截獲的字串;指定多個參數時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數時,返回group(0);沒有截獲字串的組返回None;截獲了多次的組返回最後一次截獲的子串。

groups([default]):

以元組形式返回全部分組截獲的字串。相當於調用group(1,2,…last)。default表示沒有截獲字串的組以這個值替代,默認為None。

groupdict([default]):

返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內。default含義同上。

start([group]):

返回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。

end([group]):

返回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。

span([group]):

返回(start(group), end(group))。

expand(template):

將匹配到的分組代入template中然後返回。template中可以使用id或g、g引用分組,但不能使用編號0。id與g是等價的;但將被認為是第10個分組,如果你想表達之後是字元'0',只能使用g<1>0。

下面來用一個py實例輸出所有的內容加深理解:

2.3. Pattern

Pattern物件是一個編譯好的規則運算式,通過Pattern提供的一系列方法可以對文本進行匹配查找。

Pattern不能直接產生實體,必須使用re.compile()進行構造,也就是re.compile()返回的對象。

Pattern提供了幾個可讀屬性用於獲取運算式的相關資訊:

pattern: 編譯時用的運算式字串。

flags: 編譯時用的匹配模式。數位形式。

groups: 運算式中分組的數量。

groupindex: 以運算式中有別名的組的別名為鍵、以該組對應的編號為值的字典,沒有別名的組不包含在內。

可以用下面這個例子查看pattern的屬性:

match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none

例如:

print(re.match(‘super’, ‘superstition’).span())

會返回(0, 5)

print(re.match(‘super’, ‘insuperable’))

則返回None

search()會掃描整個字串並返回第一個成功的匹配

例如:

print(re.search(‘super’, ‘superstition’).span())

返回(0, 5)

print(re.search(‘super’, ‘insuperable’).span())

返回(2, 7)

看一個search的實例:

7.subn

subn(repl, string[, count]) |re.sub(pattern, repl, string[, count]):

返回 (sub(repl, string[, count]), 替換次數)。

同樣,正文部分用div和class綜合標記,接下來要做的只是用規則運算式來匹配即可。

運行截圖:

生成的txt檔:

謝謝閱讀!

如有侵權請聯繫小編刪除!

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示