11 使用正則表示式進行頁面提取
上節課我們學習瞭如何使用 BeautifulSoup 來解析頁面,這節課我們來學習下如何使用正則來解析頁面。
- 正則表示式的基本概念
- 正則表示式基本語法
- 正則表示式常用函式
通過學習正則表示式幾個常用函式,可以根據需要對資料進行匹配篩選。
1. 正則表示式簡介
在編寫爬蟲的過程中,我們需要解析網頁的內容。那麼作為文字解析利器的正則表示式當然可以運用到我們的爬蟲開發中。其實頁面解析過程無非是從海量的字串中將我們所需要的資料匹配並剝離出來,所以在正式的爬蟲開發中正則會經常被用到。
正則表示式是對字串操作的邏輯公式。在提取網頁的資料的時候,我們需要把原始碼轉換成字串,然後通過正則表示式匹配想要的資料。
在我們開始使用正則表示式進行模式查詢之前,我們需要先熟悉一下正則表示式裡面的字元的基本含義,熟悉了它們之後,我們就可以很方便的書寫一些正則表示式進行模式匹配了。
2. 正則表示式基本語法
正則表示式的字元和含義
模式 | 描述 |
---|---|
. | 匹配任意字元, 除了換行符 |
* | 匹配前一個字元0次或者多次 |
+ | 匹配前一個字元1次或者多次 |
? | 匹配前一個字元0次或者1次 |
^ | 匹配字串開頭 |
$ | 匹配字串結尾 |
() | 匹配括號內的表示式,表示一個組 |
\s | 匹配空白字元 |
\S | 匹配任何空白字元 |
\d | 匹配數字,等於[0-9] |
\D | 匹配非數字,等於[^0-9] |
\w | 匹配字元數字,等於[A-Za-z0-9] |
\W | 匹配非字元數字,等於[^A-Za-z0-9] |
[] | 表示一組字元 |
3. 正則表示式的常用方法
我們開發爬蟲使用的是 Python 語言,那麼在 Python 中如何使用正則表示式呢?在 Python 中已經內建了正則表示式模組 re
,re
庫是內建在 Python 中的,不需要我們進行安裝,直接匯入使用即可。
這裡我們主要詳細講解一下 re
庫中的幾種常用方法。這幾種方法也是會經常用在爬蟲開發中的,只要掌握了這些種方法,基本上在爬蟲開發中需要使用正則表示式的問題都可以解決。
3.1 re.findall
findall 方法是找到所有的符合規則的匹配內容,具體語法如下:
re. findall(pattern, string, flags=0)
來看個例子,找出所有的字串中的數字:
import re # 匯入正則
example = 'abc 33 bbb 3223 yehgst adsfe3 332' # 建立目標字串
pattern = '\d+'
re.findall(pattern, example)
效果如下圖所示:
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)
效果如下圖所示:
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()
效果如下:
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)
效果如下:
3.5 re.sub
返回通過使用 repl 替換在 string 最左邊非重疊出現的 pattern 而獲得的字串。 如果樣式沒有找到,則不加改變地返回 string。 repl 可以是字串或函式;如為字串,則其中任何反斜槓轉義序列都會被處理。 也就是說,\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)
例子如下:
3.6 re.subn
行為與 sub() 相同,但是返回一個元組 (字串, 替換次數).
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)
例子如下:
4. 小結
這一小節,我們學習了正則表示式的基本語法,以及通過多個例子展示了正則表示式的使用方法,正則表示式難有一點大, 同學們需要多加練習,才能牢固的掌握。