02.25 Python爬蟲分享:使用正則表達式巧妙的解析網頁,包你學以致用

前兩天小編整理一份爬蟲的資料,不知道大傢伙是否還記得,這一次小編結合所學習的內容,跟大家分享分享。

大家可以給小編提提意見,今天主要分享的是使用正則表達式解析網頁。

Python爬蟲是非常重要的板塊,學起來剛開始有一些迷茫,慢慢的熟悉之後就變成“老司機”,相信剛開始學習python的小夥伴也能和小編一樣,可以學著自己分享一下一些東西。

每一個上班族或者就算宅在家的人,每天都需要打開網頁搜索資料,所以今天我們就利用Python爬蟲,來解析網頁。

Python爬蟲分享:使用正則表達式巧妙的解析網頁,包你學以致用

話不多少,下面正式開始分享

認識正則表達式

正則表達式就是對字符串進行操作的邏輯公式,相當於‘過濾’這個字符串。

一開始學習可能是懵懂的,小編就是這樣,後來一直不停的複習,總算是學會了。

常用的正則表達式

單字符:

. : 除換行以外所有字符

[] :[aoe] [a-w] 匹配集合中任意一個字符

\\d :數字 [0-9]

\\D : 非數字

\\w :數字、字母、下劃線、中文

\\W : 非\\w

\\s :所有的空白字符包,括空格、製表符、換頁符等等。等價於 [ \\f\\n\\r\\t\\v]。

\\S : 非空白

數量修飾:

* : 任意多次 >=0

+ : 至少1次 >=1

? : 可有可無 0次或者1次

{m} :固定m次 hello{3,}

{m,} :至少m次

{m,n} :m-n次

邊界:

$ : 以某某結尾

^ : 以某某開頭

分組:

(ab)

貪婪模式: .*

非貪婪(惰性)模式: .*?

re.I : 忽略大小寫

re.M :多行匹配

re.S :單行匹配

re.sub(正則表達式, 替換內容, 字符串)

Python爬蟲分享:使用正則表達式巧妙的解析網頁,包你學以致用

re.match方法

這裡直接來講解正則表達式的re.match方法:

先上一批代碼:

import re

test=re.match('www','www.baidu.com')

print('result:',test)

print('begin and end tuple:',test.span())

print('begin:',test.start())

print('end:',test.end())

利用re.match方法,結果為:

result: <re.match>

begin and end tuple:(0, 3)

begin:0

end:3

span()是匹配結果的開始位置和結束位置

start()和end()則是分別開始和結束。

下面試著把pattern進行一些改變:

import re

pattern='Cats are smarter than dogs'

test=re.match(r'(.*) are (.*?) dogs',pattern)

print('the whole sentence:',test.group(0))

print('the first result:',test.group(1))

print('the second result:',test.group(2))

print('a tuple for result:',test.groups())

最終結果,你會得到:

the whole sentence: Cats are smarter than dogs

the first result: Cats

the second result: smarter than

a tuple for result: ('Cats', 'smarter than')

注意:r表示純字符,防止反斜槓轉譯。

()裡面小編這裡用的是嵌入正則表達式,所以就最後匹配了Cats和smarter than。

Python爬蟲分享:使用正則表達式巧妙的解析網頁,包你學以致用

re.search方法

re.match只從字符串開始進行匹配,請看下面代碼:

import re

link='www.baidu.com'

print(re.match('baidu',link))

print(re.search('baidu',link))

結果顯示:

None

<re.match>

從這裡就可以看到,這兩者的區別,match發現開頭沒有就直接返回None了,而search則從頭掃描到尾。

Python爬蟲分享:使用正則表達式巧妙的解析網頁,包你學以致用

re.findall方法

這個就是比較牛掰的方法,也是小編常用的,因為它可以找到所有的匹配。比如:

import re

link='www.baidu.com www.baidu,com'

print(re.match('www',link))

print(re.search('www',link))

print(re.findall('www',link))

結果如下:

<re.match>

<re.match>

['www', 'www']

我們可以看到Match和search只能返回一個www,但是使用findall可以找到所有的哦,所以小編可以推薦大家使用re.findall方法,不過也要根據自己情況而定。

這三種方法,小編做了稍微的總結,用一句話概括:一山還比一山高。

search比Match用起來則更加靈活,findall又比前兩者爬取到更多網頁知識,整體學起來是不是很難,主要是需要對症下藥,找到合適的匹配規則。

其實小編學習python爬蟲時間並不長,在此期間加入了一個學習python的社群,天天與學習python的童鞋們交流分享,不懂的問題也有助教老師幫我們分析,所以說掌握知識很簡單,如果你也想加入我們這個大家庭,歡迎來私信小編~

如果你對這篇文章感興趣,或者你身邊的人正在學習python,可以分享給朋友們一起交流學習。


分享到:


相關文章: