Python爬蟲教程之利用正則表達(dá)式匹配網(wǎng)頁內(nèi)容
前言
Python爬蟲,除了使用大家廣為使用的scrapy架構(gòu)外,還有很多包能夠?qū)崿F(xiàn)一些簡單的爬蟲,如BeautifulSoup、Urllib、requests,在使用這些包時,有的網(wǎng)絡(luò)因為比較復(fù)雜,比較難以找到自己想要的代碼,在這個時候,如果能夠使用正則表達(dá)式,將能很方便地爬取到自己想要的數(shù)據(jù)。
何為正則表達(dá)式
正則表達(dá)式是一種描述字符串排列的一種語法規(guī)則,通過該規(guī)則可以在一個大字符串中匹配出滿足規(guī)則的子字符串。簡單來說,就是給定了一個字符串,在字符串中找到想要的字符串,如一個電話號碼,一個IP地址,一個字段,在爬蟲過程中,如果靈活使用正則表達(dá)式,將極大地提升爬蟲效率。
正則表達(dá)式 | 描述 |
---|---|
^ | 匹配字符串的開頭 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了換行符,當(dāng)re.DOTALL標(biāo)記被指定時,則可以匹配包括換行符的任意字符。 |
[…] | 用來表示一組字符,單獨列出:[amk] 匹配 ‘a(chǎn)',‘m'或'k' |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0個或多個的表達(dá)式。 |
re+ | 匹配1個或多個的表達(dá)式。 |
re? | 匹配0個或1個由前面的正則表達(dá)式定義的片段,非貪婪方式 |
re{ n} | |
re{ n,} | 精確匹配n個前面表達(dá)式。 |
re{ n, m} | 匹配 n 到 m 次由前面的正則表達(dá)式定義的片段,貪婪方式 |
a | b |
(re) | G匹配括號內(nèi)的表達(dá)式,也表示一個組 |
(?imx) | 正則表達(dá)式包含三種可選標(biāo)志:i, m, 或 x 。只影響括號中的區(qū)域。 |
(?-imx) | 正則表達(dá)式關(guān)閉 i, m, 或 x 可選標(biāo)志。只影響括號中的區(qū)域。 |
(?: re) | 類似 (…), 但是不表示一個組 |
(?imx: re) | 在括號中使用i, m, 或 x 可選標(biāo)志 |
(?-imx: re) | 在括號中不使用i, m, 或 x 可選標(biāo)志 |
(?#…) | 注釋. |
(?= re) | 前向肯定界定符。如果所含正則表達(dá)式,以 … 表示,在當(dāng)前位置成功匹配時成功,否則失敗。但一旦所含表達(dá)式已經(jīng)嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。 |
(?! re) | 前向否定界定符。與肯定界定符相反;當(dāng)所含表達(dá)式不能在字符串當(dāng)前位置匹配時成功 |
(?> re) | 匹配的獨立模式,省去回溯。 |
\w | 匹配字母數(shù)字 |
\W | 匹配非字母數(shù)字 |
\s | 匹配任意空白字符,等價于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意數(shù)字,等價于 [0-9]. |
\D | 匹配任意非數(shù)字 |
\A | 匹配字符串開始 |
\Z | 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串。c |
\z | 匹配字符串結(jié)束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b' 可以匹配"never" 中的 ‘er',但不能匹配 “verb” 中的 ‘er'。 |
\B | 匹配非單詞邊界?!甧r\B' 能匹配 “verb” 中的 ‘er',但不能匹配 “never” 中的 ‘er'。 |
\n, \t, 等. | 匹配一個換行符。匹配一個制表符。等 |
\1…\9 | 匹配第n個分組的子表達(dá)式。 |
\10 | 匹配第n個分組的子表達(dá)式,如果它經(jīng)匹配。否則指的是八進(jìn)制字符碼的表達(dá)式。 |
Python使用正則表達(dá)式
re.match
import re str1='123asdfa' mathch1 = re.match("^[0-9]",str1) print(mathch1.group())
結(jié)果
1
如果要匹配12,則
import re str1='12s3asdfa' mathch1 = re.findall("1[0-9]",str1) print(mathch1)
結(jié)果
['12']
修改[0-9]為[10-19]是無法匹配到的。
因此,該語句將從頭到尾匹配字符,匹配到則結(jié)束,需要.group才能獲取到匹配到的值。
re.search
import re str1='1a2s3asdfa' mathch1 = re.search("^[0-9]",str1) print(mathch1.group())
結(jié)果
1
從頭到尾匹配字符,直到找到一個匹配,需要.group才能獲取到匹配到的值。re.serach()和re.match()的區(qū)別,re.search()將匹配所有的字符,re.match只匹配字符串的開頭,如果開頭不符合規(guī)則,則返回None。
re.split()
import re str1='1a2s3asdfa' mathch1 = re.split("[0-9]",str1) print(mathch1)
結(jié)果
['', 'a', 's', 'asdfa']
將匹配到的字符作為分隔符分隔字符串。
re.findall()
import re str1='12s3asdfa' mathch1 = re.findall("[0-9]",str1) print(mathch1)
運(yùn)行結(jié)果
['1', '2', '3']
匹配所有符合規(guī)則的字符。
re.sub(pattern, repl, string, count,flag)
import re str1='12s3asdfa' mathch1 = re.sub("[0-9]",'|',str1) print(mathch1)
結(jié)果
||s|asdfa
用后面的字符替換前面的符合規(guī)則的字符。
爬蟲實例
如需要爬取豆瓣熱門電影2019,網(wǎng)址為:https://movie.douban.com/chart
首先鼠標(biāo)右鍵查看網(wǎng)頁源代碼
如我們需要爬取電影的名稱,我們搜索‘
82年生的金智英'
正則表達(dá)式的思路是通過需要爬去的字段旁邊的字符去夾住想要的字符串,如我們需要‘82年生金智英'這穿字符,我們可以用“13px;">”和“<”去夾住它。
搜索該結(jié)構(gòu)可以發(fā)現(xiàn),只有標(biāo)題會用到該結(jié)構(gòu),不會誤爬到其他無關(guān)字符串。下面上爬蟲代碼
import re import requests url='https://movie.douban.com/chart' header={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36' } result= requests.get(url,headers=header) data=re.findall(r'13px\;\"\>([^\<]+)',result.text) print(data)
結(jié)果是一個長度為9的數(shù)組。
['82年生金智英 / Kim Ji-young,Born 1982', '愛爾蘭殺手(港) / 聽說你刷房子了', '小丑起源電影:羅密歐 / Romeo', '情迷紐約下雨天(港) / 紐約有雨', '從前, 有個荷里活(港) / 從前,有個好萊塢...(臺)', '長安盜', '地下6號 / 六尺之下', '喪尸樂園:連環(huán)尸殺(港) / 尸樂園:臟比雙拼(臺)', '浴火的少女畫像(港) / 燃 燒女子的畫像(臺)']
該爬蟲需要用到headers,不然會拒絕連接。
data=re.findall(r'13px\;\"\>([^\<]+)',result.text)
表示在result.text這個長字符串中查找,獲取“13px;">”和“<”之間的字符串," \ "代表轉(zhuǎn)移字符,否則無法識別這些符號。
這個案例可能不是最好的使用正則表達(dá)式的例子,但是想要給大家分享的是,以后如果遇到很復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),與其一層一層解析,不妨換一種思路,使用正則表達(dá)式說不定能夠“柳暗花明又一村”。
總結(jié)
到此這篇關(guān)于Python爬蟲教程之利用正則表達(dá)式匹配網(wǎng)頁內(nèi)容的文章就介紹到這了,更多相關(guān)Python爬蟲用正則表達(dá)式匹配網(wǎng)頁內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python和opencv的mask實現(xiàn)摳圖疊加
這篇文章主要介紹了使用python和opencv的mask實現(xiàn)摳圖疊加操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04python中urllib.request和requests的使用及區(qū)別詳解
這篇文章主要介紹了python中urllib.request和requests的使用及區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Django Haystack 全文檢索與關(guān)鍵詞高亮的實現(xiàn)
這篇文章主要介紹了Django Haystack 全文檢索與關(guān)鍵詞高亮的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02pandas分組排序 如何獲取第二大的數(shù)據(jù)
這篇文章主要介紹了pandas分組排序 獲取第二大的數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03