python爬蟲學(xué)習(xí)-day2正則表達(dá)式

目錄

  1. python爬蟲學(xué)習(xí)-day1
  2. python爬蟲學(xué)習(xí)-day2正則表達(dá)式
  3. python爬蟲學(xué)習(xí)-day3-BeautifulSoup
  4. python爬蟲學(xué)習(xí)-day4-使用lxml+xpath提取內(nèi)容
  5. python爬蟲學(xué)習(xí)-day5-selenium
  6. python爬蟲學(xué)習(xí)-day6-ip池
  7. python爬蟲學(xué)習(xí)-day7-實(shí)戰(zhàn)

查考python爬蟲學(xué)習(xí)-day2正則表達(dá)式

正則表達(dá)式(Regular Expression)是一種文本模式,包括普通字符(例如荆忍,a到z之間的字母)和特殊字符(稱為”元字符”)倦挂。正則表達(dá)式使用單個(gè)字符串來描述碰凶、匹配一系列匹配某個(gè)句法規(guī)則的字符串靖秩。

簡(jiǎn)介

我們很可能使用 ? 和 通配符來查找硬盤上的文件纸兔。? 通配符匹配文件名中的 0 個(gè)或 1 個(gè)字符誓沸,而 通配符*匹配零個(gè)或多個(gè)字符姿锭。

簡(jiǎn)單實(shí)例:

^[0-9]+abc$塔鳍,其含義是:

^為匹配輸入字符串的開始位置
[0-9]+匹配多個(gè)數(shù)字,[0-9]匹配單個(gè)數(shù)字呻此,+匹配一個(gè)或者多個(gè)
abc$匹配字符abc并以abc結(jié)尾轮纫,$為匹配輸入字符串的結(jié)束位置。

為什么使用正則表達(dá)式焚鲜?

通過使用正則表達(dá)式掌唾,可以:

  • 測(cè)試字符串內(nèi)的模式。例如忿磅,可以測(cè)試輸入字符串糯彬,以查看字符串內(nèi)是否出現(xiàn)電話號(hào)碼模式或信用卡號(hào)碼模式。這稱為數(shù)據(jù)驗(yàn)證葱她。
  • 替換文本撩扒。可以使用正則表達(dá)式來識(shí)別文檔中的特定文本吨些,完全刪除該文本或者用其他文本替換它搓谆。
  • 基于模式匹配從字符串中提取子字符串『朗可以查找文檔內(nèi)或輸入域內(nèi)特定的文本泉手。

python正則表達(dá)式

re模塊使python語言擁有全部的正則表達(dá)式功能。

re.match函數(shù)

re.match 嘗試從字符串的起始位置匹配一個(gè)模式偶器,如果不是起始位置匹配成功的話斩萌,match()就返回None缝裤。函數(shù)語法:

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

    pattern: 匹配的正則表達(dá)式
    string: 要匹配的字符串
    flags: 標(biāo)志位颊郎,用于控制正則表達(dá)式的匹配方式

我們可以使用group(num)或groups()匹配對(duì)象函數(shù)來獲取匹配表達(dá)式憋飞。

group(num=0): 匹配的整個(gè)表達(dá)式的字符串,
group() 可以一次輸入多個(gè)組號(hào)袭艺,在這種情況下它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組搀崭。
groups(): 返回一個(gè)包含所有小組字符串的元組叨粘,從 1 到 所含的小組號(hào)猾编。

示例



import re

def testMatch():
    str = 'www.runoob.com'
    regex = 'www'
    print(re.match(regex, str).span())
    print(re.match('com', str))
testMatch()

結(jié)果:

re-01.png

span()函數(shù)span() 返回一個(gè)元組包含匹配 (開始,結(jié)束) 的位置。

def test01():
    line = 'cats are smarter than dogs'
    # .*代表匹配除換行符之外的所有字符
    # (.*?)第二個(gè)匹配分組, 非貪戀的
    # re.I 忽略大小寫
    # re.M 多行模式
    matchObj = re.match(r'(.*)are(.*?).*', line, re.M|re.I)
    if matchObj:
        print('matchObj.group(): ', matchObj.group())
        print('matchObj.group(1): ', matchObj.group(1))
        print('matchObj.group(2): ', matchObj.group(2))
    else:
        print('Nothing found!')
test01()

結(jié)果:

re-02.png

re.search函數(shù)

re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配升敲。函數(shù)語法:

re.search(pattern, string, flags=0)答倡,參數(shù)含義與match函數(shù)的相同。

示例:

def search():
    print(re.search('www', 'www.runoob.com').span())
    print(re.search('com', 'www.runoob.com').span())

search()

結(jié)果:

re-03.png

re.match與re.search的區(qū)別

re.match只匹配字符串的開始驴党,如果字符串開始不符合正則表達(dá)式瘪撇,則匹配失敗,函數(shù)返回None港庄;
而re.search匹配整個(gè)字符串倔既,直到找到一個(gè)匹配。

檢索與替換

Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項(xiàng)鹏氧。語法:

re.sub(pattern, repl, string, count=0, flags=0)渤涌。參數(shù):

pattern : 正則中的模式字符串。
repl : 替換的字符串把还,也可為一個(gè)函數(shù)实蓬。
string : 要被查找替換的原始字符串。
count : 模式匹配后替換的最大次數(shù)吊履,默認(rèn) 0 表示替換所有的匹配安皱。

示例:

def sub():
    phone = '500-234-222 # 號(hào)碼'
    num  = re.sub(r'#.*$','', phone)
    print('號(hào)碼:' , num)
    #  \D 匹配非數(shù)字
    num  = re.sub(r'\D', '', num)
    print('號(hào)碼:', num)

結(jié)果:

re-04.png

repl參數(shù)一個(gè)函數(shù)

下面例子將字符串中的匹配的數(shù)字乘以2:
記住要加?號(hào),否則沒有命名成功為group:

def double(matched):
    value = int(matched.group('value'))
    return str(value * 2)
def sub2():
    s = 'A12F45S98'
    # ?P<value> 代表為group分組艇炎,添加一個(gè)分組名
    print(re.sub('(?P<value>\d+)', double, s))
    # 記住要加?號(hào)
    print(re.sub('(P<value>\d+)', double, s))
sub2()

結(jié)果:

re-05.png

re.compile函數(shù)

compile 函數(shù)用于編譯正則表達(dá)式酌伊,生成一個(gè)正則表達(dá)式( Pattern )對(duì)象,供 match() 和 search() 這兩個(gè)函數(shù)使用缀踪。

語法格式為:re.compile(pattern[, flags])

參數(shù):

pattern : 一個(gè)字符串形式的正則表達(dá)式
flags : 可選腺晾,表示匹配模式,比如忽略大小寫辜贵,多行模式等悯蝉,具體參數(shù)為:
re.I 忽略大小寫
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴于當(dāng)前環(huán)境
re.M 多行模式
re.S 即為 . 并且包括換行符在內(nèi)的任意字符(. 不包括換行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字符屬性數(shù)據(jù)庫
re.X 為了增加可讀性,忽略空格和 # 后面的注釋
import re

pattern = re.compile(r'world')
match = re.search(pattern, 'hello world')
# <re.Match object; span=(6, 11), match='world'>
## 可以匹配到托慨,是匹配整個(gè)字符串
if match:
    print(match.group())

re.findall函數(shù)

在字符串中找到正則表達(dá)式所匹配的所有子串鼻由,并返回一個(gè)列表,如果沒有找到匹配的,則返回空列表蕉世。語法格式為:findall(string, pos, endpos)

import re
a = re.findall(r"a(\d+?)", 'a23b')
print(a)
b = re.findall(r"a(\d+)", 'a23b')
print(b)
'''執(zhí)行結(jié)果:
['2']
['23']'''

a = re.match('<(.*)>', '<H1>title<H1>').group()
print(a)
b = re.match('<(.*?)>', '<H1>title<H1>').group()
print(b)
'''執(zhí)行結(jié)果:
<H1>title<H1>
<H1>'''

a = re.findall(r"a(\d+)b", 'a3333b')
print(a)
b = re.findall(r"a(\d+?)b", 'a3333b')
print(b)
'''
執(zhí)行結(jié)果如下:
['3333']
['3333']
這里需要注意的是如果前后均有限定條件的時(shí)候蔼紧,就不存在什么貪婪模式了,非匹配模式失效狠轻。
'''


爬取豆瓣top50的內(nèi)容

結(jié)合requests奸例、re兩者的內(nèi)容爬取 https://movie.douban.com/top250 中的內(nèi)容,要求抓取名次向楼、影片名稱查吊、國家、導(dǎo)演等字段湖蜕。

示例:

import re
import requests
import csv
# 結(jié)合requests逻卖、re兩者的內(nèi)容爬取 https://movie.douban.com/top250 中的內(nèi)容,要求抓取名次昭抒、影片名稱评也、國家、導(dǎo)演等字段灭返。
def get_html(url):
    headers = {}
    headers[
        'User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'
    res = requests.get(url, headers=headers)
    res.encoding = 'utf-8'
    if res.status_code == 200:
        return res.text
    return None

def get_info(html):
    pattern = re.compile(r'<li.*?<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>.*?導(dǎo)演:(.*?)&nbsp;&nbsp;(.*?)<br>(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;(.*?).*?</p>.*?<div class="star">.*?<span class="rating_num" property="v:average">(.*?)</span>.*?<span>(.*?)人.*?</li>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        index = re.sub(re.compile('\s+'), '', item[0])
        movie_name = re.sub(re.compile('\s+'), '', item[1])
        country = re.sub(re.compile('\s+'), '', item[5])
        # director = re.sub(re.compile('\s+'), '', item[2])
        director = item[2].strip()
        score = re.sub(re.compile('\s+'), '', item[7])
        # 一個(gè)帶有 yield 的函數(shù)就是一個(gè) generator
        writer.writerow([item[0], item[1], item[5], item[2], item[7]])
        print({
            'index': index,
            'movie_name': movie_name,
            'country': country,
            'director': director,
            'score': score
        })


if __name__ == '__main__':
    file = open('G:/NLP/movie.csv', 'w+', encoding='utf-8', newline='')
    writer = csv.writer(file)
    writer.writerow(['index', 'movie_name', 'country', 'director', 'score'])
    for i in range(10):
        url = 'https://movie.douban.com/top250?start=%d&filter=' % (i * 25)
        html = get_html(url)
        get_info(html)

結(jié)果:

douban-1.png
1

PS: 若你覺得可以盗迟、還行、過得去熙含、甚至不太差的話罚缕,可以“關(guān)注或點(diǎn)贊”一下,就此謝過!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婆芦,一起剝皮案震驚了整個(gè)濱河市怕磨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌消约,老刑警劉巖肠鲫,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異或粮,居然都是意外死亡导饲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門氯材,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渣锦,“玉大人,你說我怎么就攤上這事氢哮〈校” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵冗尤,是天一觀的道長(zhǎng)听盖。 經(jīng)常有香客問我胀溺,道長(zhǎng),這世上最難降的妖魔是什么皆看? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任仓坞,我火速辦了婚禮,結(jié)果婚禮上腰吟,老公的妹妹穿的比我還像新娘无埃。我一直安慰自己,他們只是感情好毛雇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布嫉称。 她就那樣靜靜地躺著,像睡著了一般禾乘。 火紅的嫁衣襯著肌膚如雪澎埠。 梳的紋絲不亂的頭發(fā)上虽缕,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天始藕,我揣著相機(jī)與錄音,去河邊找鬼氮趋。 笑死伍派,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剩胁。 我是一名探鬼主播诉植,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼昵观!你這毒婦竟也來了晾腔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤啊犬,失蹤者是張志新(化名)和其女友劉穎灼擂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觉至,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剔应,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了语御。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峻贮。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖应闯,靈堂內(nèi)的尸體忽然破棺而出纤控,到底是詐尸還是另有隱情,我是刑警寧澤碉纺,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布船万,位于F島的核電站细层,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唬涧。R本人自食惡果不足惜疫赎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碎节。 院中可真熱鬧捧搞,春花似錦、人聲如沸狮荔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殖氏。三九已至晚树,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雅采,已是汗流浹背爵憎。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婚瓜,地道東北人宝鼓。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巴刻,于是被迫代替她去往敵國和親愚铡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354