小甲魚python學習筆記html
爬蟲之正則表達式python
1.入門(要import re)正則表達式
正則表達式中查找示例:ide
>>> import re >>> re.search(r'FishC','I love FishC.com') <re.Match object; span=(7, 12), match='FishC'> >>> #單純的這種查找str的find方法也能夠實現 >>> 'I love FishC.com'.find('FishC') 7
通配符:在正則表達式中爲「 .」(點),便可以表明任何字符。若是找「.」這個字符自己,能夠經過轉義「\.」學習
還能夠經過特殊字符找到數字。url
>>> re.search(r'.','I love FishC.com') <re.Match object; span=(0, 1), match='I'> >>> re.search(r'Fish.','I love FishC.com') <re.Match object; span=(7, 12), match='FishC'> >>> re.search(r'\.','I love FishC.com') <re.Match object; span=(12, 13), match='.'> >>> re.search(r'\d','I love 123 FishC.com') <re.Match object; span=(7, 8), match='1'> >>> re.search(r'\d\d\d','I love 123 FishC.com') <re.Match object; span=(7, 10), match='123'>
尋找IP地址:spa
>>> re.search(r'\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d','192.168.111.123') <re.Match object; span=(0, 15), match='192.168.111.123'>
可是上面這種尋找IP地址的方法存在問題。好比:當IP地址不知足上面格式的時候就找不到(192.168.1.3)3d
字符類:code
中括號建立字符類,看匹配字符類中哪個htm
<re.Match object; span=(0, 15), match='192.168.111.123'> >>> re.search(r'[aeiou]','I love FishC.com')#區分大小寫 <re.Match object; span=(3, 4), match='o'>
正則表達式中‘-’表示範圍
>>> re.search(r'[a-z]','I love FishC.com') <re.Match object; span=(2, 3), match='l'> >>> re.search(r'[0-9]','I love 123 FishC.com') <re.Match object; span=(7, 8), match='1'>
正則表達式中‘{數字}’表示重複次數
>>> re.search(r'ab{3}c','abbbc') <re.Match object; span=(0, 5), match='abbbc'> >>> re.search(r'ab{3}c','abbbbbbc')#找不到哦匹配結果 >>> re.search(r'ab{3,10}c','abbbbbbbc')#3到10中均可以 <re.Match object; span=(0, 9), match='abbbbbbbc'>
尋找0-255的數字
>>> re.search(r'[01]\d\d|2[0-4]\d|25[0-5]','188') <re.Match object; span=(0, 3), match='188'>
尋找IP地址
>>> re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])','192.168.1.3') <re.Match object; span=(0, 11), match='192.168.1.3'>
2.正則表達式模式
模式 | 描述 |
---|---|
^ | 匹配字符串的開頭 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則能夠匹配包括換行符的任意字符。 |
[...] | 用來表示一組字符,單獨列出:[amk] 匹配 'a','m'或'k' |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c以外的字符。 |
re* | 匹配0個或多個的表達式。 |
re+ | 匹配1個或多個的表達式。 |
re? | 匹配0個或1個由前面的正則表達式定義的片斷,非貪婪方式 |
re{ n} | 精確匹配 n 個前面表達式。例如, o{2} 不能匹配 "Bob" 中的 "o",可是能匹配 "food" 中的兩個 o。 |
re{ n,} | 匹配 n 個前面表達式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的全部 o。"o{1,}" 等價於 "o+"。"o{0,}" 則等價於 "o*"。 |
re{ n, m} | 匹配 n 到 m 次由前面的正則表達式定義的片斷,貪婪方式 |
a| b | 匹配a或b |
(re) | 匹配括號內的表達式,也表示一個組 |
(?imx) | 正則表達式包含三種可選標誌:i, m, 或 x 。隻影響括號中的區域。 |
(?-imx) | 正則表達式關閉 i, m, 或 x 可選標誌。隻影響括號中的區域。 |
(?: re) | 相似 (...), 可是不表示一個組 |
(?imx: re) | 在括號中使用i, m, 或 x 可選標誌 |
(?-imx: re) | 在括號中不使用i, m, 或 x 可選標誌 |
(?#...) | 註釋. |
(?= re) | 前向確定界定符。若是所含正則表達式,以 ... 表示,在當前位置成功匹配時成功,不然失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提升;模式的剩餘部分還要嘗試界定符的右邊。 |
(?! re) | 前向否認界定符。與確定界定符相反;當所含表達式不能在字符串當前位置匹配時成功 |
(?> re) | 匹配的獨立模式,省去回溯。 |
\w | 匹配字母數字及下劃線 |
\W | 匹配非字母數字及下劃線 |
\s | 匹配任意空白字符,等價於 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意數字,等價於 [0-9]. |
\D | 匹配任意非數字 |
\A | 匹配字符串開始 |
\Z | 匹配字符串結束,若是是存在換行,只匹配到換行前的結束字符串。 |
\z | 匹配字符串結束 |
\G | 匹配最後匹配完成的位置。 |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 能夠匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
\n, \t, 等. | 匹配一個換行符。匹配一個製表符。等 |
\1...\9 | 匹配第n個分組的內容。 |
\10 | 匹配第n個分組的內容,若是它經匹配。不然指的是八進制字符碼的表達式。 |
3.模式對象
>>> p=re.compile(r'[A-Z]') >>> p.search("I love fishC.com") <re.Match object; span=(0, 1), match='I'> >>> p.findall("I love fishC.com") ['I', 'C']
4.search()方法
>>> result=re.search(r' (\w+) (\w+)','I love FishC.com') >>> result <re.Match object; span=(1, 12), match=' love FishC'> >>> result.group() ' love FishC' >>> result.group(1) 'love' >>> result.group(2) 'FishC'
>>> result.start() 1 >>> result.end() 12 >>> result.span() (1, 12)
5.findall()方法,爬取貼吧圖片
1 import urllib.request 2 import re 3 4 def open_url(url): 5 req=urllib.request.Request(url) 6 req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36') 7 page=urllib.request.urlopen(req) 8 html=page.read().decode('utf-8') 9 return html 10 def get_img(html): 11 p=r'<img class="BDE_Image" src="([^"]+\.jpg)"' 12 imglist=re.findall(p,html) 13 #for each in imglist: 14 # print(each) 15 for each in imglist: 16 filename=each.split("/")[-1] 17 urllib.request.urlretrieve(each,filename,None) 18 if __name__=='__main__': 19 url='https://tieba.baidu.com/p/6105104081' 20 get_img(open_url(url))
6.異常處理
URLError:
>>> import urllib.request >>> import urllib.error >>> req=urllib.request.Request("http://www.ooxx-fishc.com") >>> try: urllib.request.urlopen(req) except urllib.error.URLError as e: print(e.reason) [Errno 11001] getaddrinfo failed
HTTPError:是URLError的子類
req=urllib.request.Request("http://www.runoob.com/python/pythontkinter.html") >>> try: urllib.request.urlopen(req) except urllib.error.HTTPError as e: print(e.code) print(e.read()) 404