1. 程式人生 > >python—【爬蟲】學習_2(正則表示式篇)3.re模組函式的深入理解

python—【爬蟲】學習_2(正則表示式篇)3.re模組函式的深入理解

1. re.complie()

作用:如果需要重複地使用某個正則表示式,那麼你可以先將該正則表示式編譯成模式物件。complie()函式就幫助我們將正則表示式,編譯成為一個pattern物件。

2.re.search(pattern ,string)

regex.search(string[, pos[, endpos]])
 

pattern = re.compile("d") 

>>> result = pattern.search("dog") 

>>> result

# Match at index 0 <_sre.SRE_Match object; span=(0, 1), match='d'> 

>>> pattern.search("dog", 1) 

# No match; search doesn't include 

但是他並不會返回你需要的字串,而是返回存在的範圍,這時候,就需要group函式。

>> result.group()

"d"

>> result.start()

"0"

>>result.end()

"1"
>>result.span()
(0,1)

3.re.findall(pattern,string)返回了一個list

 

注:如果findall中的pattern包含著子組的話,即用小括號圈起來的,就會把子組內容單獨圈起來。

如果存在多個子組,那麼就會把多個子組組合起來構成元組。

這個時候,為了防止瞎匹配,一般使用(?:的語法進行即可。

 

3.url.request.urlretrieve(url, filename, reporthook, data)

一般用來直接下載圖片,filename為儲存的名字。後面引數None即可。

貼吧照片爬取:

from urllib import request
import re

def open_url(url):
    req = request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
    page = request.urlopen(req)
    html =page.read().decode('utf-8')
    return html

def get_img(html):
    pattern = r'<img class="BDE_Image" src="([^"]+\.jpg)"'#[^"]+表示匹配多個不為^的字元
    imglist = re.findall(pattern,html)

    for each in imglist:
        filename = each.split("/")[-1]
        request.urlretrieve(each,filename,None)

if __name__ == '__main__':
    url = "http://tieba.baidu.com/p/5921006596"
    get_img(open_url(url))