python網(wǎng)絡(luò)爬蟲3:使用正則表達(dá)式匹配

2.非貪婪匹配之(.*?)

\d 匹配1個(gè)數(shù)字字符

\w 匹配1個(gè)字母,數(shù)字或下劃線字符

\s 匹配1個(gè)空白字符,如換行符、制表符、普通空格等

\S 匹配1個(gè)非空白字符

\n 匹配1個(gè)換行符,相當(dāng)于按1次Enter鍵

\t 匹配1個(gè)制表符,相當(dāng)于按1次Tab鍵或按8次空格鍵

# .? 匹配1個(gè)任意字符,換行符除外 *? 匹配0個(gè)或多個(gè)表達(dá)式

+? 匹配1個(gè)或多個(gè)表達(dá)式

? 非貪婪限定符,常與.和*配合使用

() 匹配括號(hào)內(nèi)的表達(dá)式,也表示一個(gè)組

例1:

import re

res = '文本A百度新聞文本B,新聞標(biāo)題文本A新聞財(cái)經(jīng)文本B,文本A搜狗新聞文本B新聞網(wǎng)址'

p_source = '文本A(.*?)文本B'

source = re.findall(p_source, res)

print(source)? # ['百度新聞']

例2:

import re

res = '<div class="news-source"><div class="c-img c-img1 c-img-circle news-source-icon_1tdlx c-gap-right-xsmall">網(wǎng)易新聞 2020年12月27日 18:37</div></div>'

p_info = '<div class="news-source">(.*?)</div>'

info = re.findall(p_info, res)

print(info)

3.非貪婪匹配之.*?

import re

res = '<h3>文本C<變化的網(wǎng)址>文本D新聞標(biāo)題</h3>'

p_title = '<h3>文本C.*?文本D(.*?)</h3>'

title = re.findall(p_title, res)

print(title)? # ['新聞標(biāo)題']

import re

res = '<h3 class="c-title"><a href=" 網(wǎng)址" data-clicck="{英文& 數(shù)字}"><em> 阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位AI評(píng)委 能為代碼質(zhì)量打分</a></h3>'

p_title = '<h3 class="c-title">.*?>(.*?)</a>'

title = re.findall(p_title, res)

print(title)? # .*?> 填充我們不要的內(nèi)容? (.*?) 要查找的內(nèi)容

# ['<em> 阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位AI評(píng)委 能為代碼質(zhì)量打分']

res2 = '<h3 class="c-title"><a

p_href = '<h3 class="c-title"><a href="(.*?)"'

href = re.findall(p_href, res2)

print(href)? # ['https://www.baidu.com/']

4.自動(dòng)考慮換行的修飾符re.S

(.*?)和.*?無(wú)法自動(dòng)匹配換行,可以用re.S

re.findall(匹配規(guī)則, 原始文本, re.S)

import re

res = ''' 文本A

? ? ? ? 百度新聞文本B'''

p_source = ' 文本A(.*?)文本B'

source = re.findall(p_source, res, re.S)

print(source)? # ['\n? ? ? ? 百度新聞']

import re

res = '''<h3 class="c-title">

? ? <a

? ? data-click="{

? ? ? ? 英文&數(shù)字

? ? }"

? ? ? ? target="_blank"

? ? >

? ? ? ? <em>阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位

? ? ? ? </a>

? ? '''

p_href = '<h3 class="c-title">.*?<a href="(.*?)"'

p_title = '<h3 class="c-title">.*?>(.*?)</a>'

href = re.findall(p_href, res, re.S)

title = re.findall(p_title, res, re.S)

print(href)? # ['http://baijiahao.baidu.com/s?id=163111&amp;wfr=spider&amp;for=pc']

print(title) # ['\n? ? ? ? <em>阿里巴巴</em> 代碼競(jìng)賽現(xiàn)全球首位\n? ? ? ? ']

5.補(bǔ)充知識(shí)

(1)sub()函數(shù):用于清洗正則表達(dá)式獲取的內(nèi)容

# re.sub(需要替換的內(nèi)容, 替換值, 原字符串)

import re

title = ['<em>阿里巴巴</em> 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分']

title[0] = re.sub('<em>', '', title[0])

title[0] = re.sub('</em>', '', title[0])

print(title[0]) # 阿里巴巴 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分

import re

title = ['<em>阿里巴巴</em> 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分']

title[0] = re.sub('<.*?>', '', title[0])

print(title[0])? # 阿里巴巴 代碼競(jìng)賽全球首位AI評(píng)委 能為代碼質(zhì)量打分

# <.*?> 任何 <>形式的內(nèi)容

# '' 替換后的內(nèi)容

# 第一個(gè)title[0]是替換后的標(biāo)題

# 最后一個(gè)title[0]是原來(lái)的標(biāo)題

(2)中括號(hào)[]的用法:使中括號(hào)里的內(nèi)容不再有特殊含義

import re

company = '* 華能信托'

company1 = re.sub('[*]', '', company)

print(company1)? #? 華能信托

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容