論乙隻爬蟲的自我修養5 正規表示式

2021-10-02 11:00:22 字數 3482 閱讀 8786

※比如你想寫乙個指令碼來自動獲取最新的**ip位址,但是肯定會遇到困難,

(解析:首先要寫個這個爬蟲肯定要先去這個**審查元素踩點,隨便選中乙個ip審查元素,然後檢視這個ip前後有什麼標籤,可以發現是被td標籤包起來了,接著你會發現別的位置也會有td標籤,但裡邊卻不是ip而是別的資訊,那你可能會花很多時間,先找乙個table標籤,然後tbody再到tr最後到td標籤成功定位了ip位址的唯一特性,但是這樣寫不僅麻煩,而且有乙個很大的問題就是不具備通用性,你在這個**可行,在另外的**就不可行了,

所以最好是可以按照自己需要的內容特徵來進行自動查詢,也就是說我要找乙個ip位址,那這個ip位址的特徵就是有四段組成,每段數字的範圍是0~255,分別是三個英文的句號隔開,這就ip位址的特徵嘛,然後就可以根據這個特徵再去網頁裡邊查詢,但是字串所附帶的方法是無法做到的,但是呢,我們遇到的問題,計算機老前輩們也早就已經想到了,並且已經幫我們設計出了非常優秀的解決方案,那就是使用正規表示式)

※正規表示式很難學,但是卻非常有用,在編寫處理字串程式或網頁的時候,經常會有查詢符合某些複雜規則字串的需要,例如剛剛說的ip位址的特徵和規則,如果使用 pythob 自帶的字串方法,你一定會惱羞成怒,那麼這時候,如果你懂得正規表示式,你會發現,這真是靈丹妙藥啊。因為正規表示式就是用於描述這些複雜規則的乙個 工具,正規表示式本身就是用於描述這些規則的,不同的程式語言也都有使用正規表示式的方法,但各不相同,python 的話是使用 re 模組來實現的

※search():用於在字串中搜尋正規表示式模式第一次出現的位置

(第乙個引數就是正規表示式模式,也就是你要描述的搜尋規則,這裡需要使用原始字串r來編寫,這樣可以避免很多不必要的麻煩,上面匹配的就是(7~12),找不到就會返回none,)

(find方法也可以完成,但顯示的是起始位址)

※萬用字元.,可以可以匹配除了 換行符 以外的任何字元。

(萬用字元* 和 ?這一類可以表示任何字元的符號,正規表示式也有所謂的萬用字元,使用的是點號(.))

(如上第一條語句,他找到了第乙個字元i,因為這個(.)代表的是除了換行符之外的任何字元,i就被匹配到了,第二句沒加c,(.)也可以匹配出來)

(同時可以通過反斜槓\來,這個時候(.)不再代表其他字元,就代表他本身,也就是說在正規表示式中,反斜槓仍然具有剝奪元字元的能力,元字元就是它本身代表著其他含義、有特殊功能的字元,例如 點號(.))

(解析:反斜槓還可以使得普通的字元用於特殊的能力,例如想要匹配到數字,就可以使用反斜槓加上乙個d,來匹配任何數字)

※嘗試匹配ip位址

(解析:可以看到匹配成功了,但這麼寫是有問題的,首先\d表示匹配的數字是0-9,而ip位址的約定範圍是0-255,現在這裡 \d\d\d 最大匹配數字是 999,而範圍是最大範圍才是255,然後第二個,你這裡要求 ip 位址每組必須有三位數字,但實際上有些 ip 位址中的某組數字只有 1 位或者 2 位,這樣就匹配不了)

※為了表示乙個字串的範圍,我們可以建立乙個叫做 字元類 的東西,使用中括號 來建立乙個字元類,字元類的含義就是你只要匹配字元類中的乙個字元,那麼就算匹配

(可以看到正規表示式 是預設開啟 大小字母敏感 模式的)

※可以在字元類中使用 橫桿 『-』 表示乙個範圍

※使用大括號來解決限定重複匹配的次數

(解析:大括號裡邊的3表示的重複的次數,表示的前面的那個字元也就是b重複的次數,然後a和c沒有那都是一次,所以匹配出了乙個a三個b乙個

c,第二句就匹配不到了因為b的重複次數超過了3)

※大括號裡還可以給出重複匹配次數的範圍

(解析:表示的就是只要它前面那個字元b出現了3-8次都是可以匹配到的,然後a和c也只是一次)

※使用正規表示式來匹配 0~255

(解析:這兩種方式都是錯誤的,匹配不到,因為正規表示式匹配的是字串,所以呢數字對於字元來說只有0-9,例如123就是有『1』、『2』、『3三個字元來組成的,那麼上面的[0-255]這個字元類表示的就是0-2然後還有兩個5,所以他就會匹配0125四個數字中的任何乙個,所以得了個1)

(解析:[01]\d\d|2[0-4\d|25[0-5]]首先這個東東要分三個部分來看,第一部分是[01]\d\d,也就是可以匹配到百位上是0開頭或者1開頭,然後十位上是\d也就是0-9中的任意數字,個位也一樣,所以這一部分表示數的範圍就是000-199,接著第二部分和第一部分用邏輯或|接上,第二部分同理,百位上數字只能是2,十位上可以是0-4,個位隨意,隨意第二步可以匹配到的範圍是200-249,第三部分也同理啦,也用邏輯或|連線,第三步就固定了百位和十位,百位只能是2,十位只能是5,個位可以是0-5,所以第三部分的範圍是250-255,綜合這三部分可以匹配到的範圍就是0-255了,, 但是這樣寫還是有問題,只能要求匹配的數字必須是 3 位的,如下:)

(解析:可以看到88匹配不出,只有寫088才可以匹配出來,因為每一位上是預設至少重複一次,所以把百位和十位改為可以重複0-1次就可以了,如下:

※最後可以來配 完整的ip位址

>>> re.

search

(r"(([01]\d\d|2[0-4\d|25[0-5]])\.)([01]\d\d|2[0-4\d|25[0-5]])"

,"192.188.68.3"

),12

), match=

'192.188.68.3'

>

(解析:ip位址是有四個部分,如192.188.68.3,每一部分的範圍是0-255,所以理論上要寫4份一樣的,然後他們之間用(.)隔開,然後每一部分用小括號括起來,但是可以看到前三個是乙個,如192. 第二個188.,第三個68.所以直接寫,重複三次就好,然後第四部分在寫一遍,就得到上面的一堆長長的表示式了

論乙隻爬蟲的自我修養9 異常處理

網頁的異常處理 高階語言的乙個優秀特性就是它可以從容不迫的處理每乙個遇到的錯誤,不至於說因為遇到乙個小錯誤就導致整個程式崩潰了,大部分高階語言處理錯誤的方法都是通過檢測異常 處理異常來實現的,python也是一樣。用程式用 進行網際網路訪問的時候,會出現異常那是再正常不過的了,例如說之前實現了乙個 ...

第60講 乙隻爬蟲的自我修養8 正規表示式

一 search方法 1 模組級別的search方法 re.search pattern,string,flags 0 2 編譯後的正規表示式模式物件也擁有search方法 regex.search string pos endpos 注意 search方法並不會立刻返回你可以使用的字串取而代之,而...

乙隻爬蟲的產生

以下環境基於py2.7 爬蟲架構 url管理器 處理待爬url以及爬過的url,防止重複抓取以及死迴圈 網頁解析器 解析出想要的資料,以及捕捉新的url位址交給url管理器進行處理繼續抓取。過濾資料,拿到有價值的資料進行處理。資料的存放 python 的 set集合 可以防止資料的重複 需要長期儲存...