11《Python 原生爬蟲教程》使用正則表達式進行頁面提取

上節(jié)課我們學習了如何使用 BeautifulSoup 來解析頁面睬涧,這節(jié)課我們來學習下如何使用正則來解析頁面模叙。

  • 正則表達式的基本概念
  • 正則表達式基本語法
  • 正則表達式常用函數(shù)

通過學習正則表達式幾個常用函數(shù),可以根據(jù)需要對數(shù)據(jù)進行匹配篩選叫搁。

1. 正則表達式簡介

在編寫爬蟲的過程中纺蛆,我們需要解析網頁的內容算利。那么作為文本解析利器的正則表達式當然可以運用到我們的爬蟲開發(fā)中在辆。其實頁面解析過程無非是從海量的字符串中將我們所需要的數(shù)據(jù)匹配并剝離出來证薇,所以在正式的爬蟲開發(fā)中正則會經常被用到。

正則表達式是對字符串操作的邏輯公式匆篓。在提取網頁的數(shù)據(jù)的時候浑度,我們需要把源代碼轉換成字符串,然后通過正則表達式匹配想要的數(shù)據(jù)奕删。

在我們開始使用正則表達式進行模式查找之前,我們需要先熟悉一下正則表達式里面的字符的基本含義疗认,熟悉了它們之后完残,我們就可以很方便的書寫一些正則表達式進行模式匹配了。

2. 正則表達式基本語法

正則表達式的字符和含義

模式 描述
. 匹配任意字符横漏, 除了換行符
* 匹配前一個字符0次或者多次
+ 匹配前一個字符1次或者多次
谨设? 匹配前一個字符0次或者1次
^ 匹配字符串開頭
$ 匹配字符串結尾
() 匹配括號內的表達式,表示一個組
\s 匹配空白字符
\S 匹配任何空白字符
\d 匹配數(shù)字缎浇,等于[0-9]
\D 匹配非數(shù)字扎拣,等于[^0-9]
\w 匹配字符數(shù)字,等于[A-Za-z0-9]
\W 匹配非字符數(shù)字素跺,等于[^A-Za-z0-9]
[] 表示一組字符

3. 正則表達式的常用方法

我們開發(fā)爬蟲使用的是 Python 語言二蓝,那么在 Python 中如何使用正則表達式呢?在 Python 中已經內置了正則表達式模塊 re指厌,re 庫是內置在 Python 中的刊愚,不需要我們進行安裝,直接導入使用即可踩验。

這里我們主要詳細講解一下 re 庫中的幾種常用方法鸥诽。這幾種方法也是會經常用在爬蟲開發(fā)中的商玫,只要掌握了這些種方法,基本上在爬蟲開發(fā)中需要使用正則表達式的問題都可以解決牡借。

3.1 re.findall

findall 方法是找到所有的符合規(guī)則的匹配內容拳昌,具體語法如下:

re.findall(pattern, string, flags=0)

來看個例子,找出所有的字符串中的數(shù)字:

import re # 導入正則

example = 'abc 33 bbb 3223 yehgst adsfe3 332' # 創(chuàng)建目標字符串
pattern = '\d+'
re.findall(pattern, example) 


效果如下圖所示:

5e7cc68509c29fd405700452.jpg

3.2 re.search

re.search 掃描整個字符串钠龙,并返回第一個成功的匹配炬藤。具體語法如下:

re.search(pattern, string, flags=0)

來看個例子:

import re

example = "Python is the best language!"

re.search('\APython', example)
re.search('\AJava', example)


效果如下圖所示:

5e7cc68509c29fd405700452.jpg

3.3 re.match

如果 string 開始的 0 或者多個字符匹配到了正則表達式樣式,就返回一個相應的匹配對象 俊鱼。 如果沒有匹配刻像,就返回 None ;注意它跟零長度匹配是不同的并闲。

re.match(pattern, string, flags=0)

實例:

import re

string = '5523 abc, cde 666623'

pattern = '(\d{4}) (\w{3})'

match = re.search(pattern, string) 

match.group(1)
match.group(2)
match.groups()


效果如下:

5e7cc69b09e754cc05700452.jpg

3.4 re.split

用 pattern 分開 string 细睡。 如果在 pattern 中捕獲到括號,那么所有的組里的文字也會包含在列表里帝火。如果 maxsplit 非零溜徙, 最多進行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一個元素

re.split(pattern, string)

實例:

import re

string = 'aaabbb 212 dxsxasxw fdexx:3453423.'
pattern = '\d+'

result = re.split(pattern, string) 
print(result)


效果如下:

5e7cc6a509bbf96905700452.jpg

3.5 re.sub

返回通過使用 repl 替換在 string 最左邊非重疊出現(xiàn)的 pattern 而獲得的字符串犀填。 如果樣式沒有找到蠢壹,則不加改變地返回 string。 repl 可以是字符串或函數(shù)九巡;如為字符串图贸,則其中任何反斜杠轉義序列都會被處理。 也就是說冕广,\n 會被轉換為一個換行符疏日,\r 會被轉換為一個回車附,依此類推撒汉。 未知的 ASCII 字符轉義序列保留在未來使用沟优,會被當作錯誤來處理。 其他未知轉義序列例如 & 會保持原樣睬辐。 向后引用像是 \6 會用樣式中第 6 組所匹配到的子字符串來替換

re.sub(pattern, replace, string)

實例:

import re

string = 'abc 3d a52a33 adex f45 6'

pattern = '\s+'

replace = ''

new_string = re.sub(pattern, replace, string) 
print(new_string)


例子如下:

5e7cc6af09b702be05700452.jpg

3.6 re.subn

行為與 sub() 相同挠阁,但是返回一個元組 (字符串, 替換次數(shù)).

re.subn(pattern, replace, string)

實例:

import re

string = 'abc 3d a52a33 adex f45 6'

pattern = '\s+'

replace = ''

new_string = re.subn(pattern, replace, string) 
print(new_string)


例子如下:

5e7cc6b70912b57305700452.jpg

4. 小結

這一小節(jié)溯饵,我們學習了正則表達式的基本語法侵俗,以及通過多個例子展示了正則表達式的使用方法,正則表達式難有一點大丰刊, 同學們需要多加練習坡慌,才能牢固的掌握。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末洪橘,一起剝皮案震驚了整個濱河市跪者,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熄求,老刑警劉巖渣玲,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異弟晚,居然都是意外死亡忘衍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門卿城,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枚钓,“玉大人,你說我怎么就攤上這事瑟押〔蠼荩” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵多望,是天一觀的道長嫩舟。 經常有香客問我,道長怀偷,這世上最難降的妖魔是什么家厌? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮椎工,結果婚禮上饭于,老公的妹妹穿的比我還像新娘。我一直安慰自己维蒙,他們只是感情好掰吕,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著木西,像睡著了一般畴栖。 火紅的嫁衣襯著肌膚如雪随静。 梳的紋絲不亂的頭發(fā)上八千,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音燎猛,去河邊找鬼恋捆。 笑死,一個胖子當著我的面吹牛重绷,可吹牛的內容都是我干的沸停。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼昭卓,長吁一口氣:“原來是場噩夢啊……” “哼愤钾!你這毒婦竟也來了瘟滨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤能颁,失蹤者是張志新(化名)和其女友劉穎杂瘸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伙菊,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡败玉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镜硕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运翼。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兴枯,靈堂內的尸體忽然破棺而出血淌,到底是詐尸還是另有隱情,我是刑警寧澤念恍,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布六剥,位于F島的核電站,受9級特大地震影響峰伙,放射性物質發(fā)生泄漏疗疟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一瞳氓、第九天 我趴在偏房一處隱蔽的房頂上張望策彤。 院中可真熱鬧,春花似錦匣摘、人聲如沸店诗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庞瘸。三九已至,卻和暖如春赠叼,著一層夾襖步出監(jiān)牢的瞬間擦囊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工嘴办, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞬场,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓涧郊,卻偏偏與公主長得像贯被,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容