日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

利用python爬虫(part3)--正则表达式

發(fā)布時間:2023/12/19 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用python爬虫(part3)--正则表达式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學(xué)習(xí)筆記


文章目錄

    • 正則表達(dá)式
      • re模塊的使用
        • 正則表達(dá)式元字符
        • 貪婪匹配和非貪婪匹配
          • 貪婪模式
          • 非貪婪模式
        • 正則表達(dá)式分組


正則表達(dá)式

re模塊的使用

re模塊在爬蟲中常用的方法:

re.findall() re.compile() pattern.finall()

匹配方式1(re.findall)

list01=re.findall('正則表達(dá)式',html,re.S) #html就是我們獲取的網(wǎng)頁源代碼字符串 #re.S為flag擴(kuò)展參數(shù),re.S表示使【.】可以匹配換行。這樣【.】就可以匹配任意字符了 #返回值為包含符合正則表達(dá)式的字符串的列表

關(guān)于flag擴(kuò)展參數(shù),詳細(xì)請見正則表達(dá)式教程。

匹配方式2(re.compile與pattern.findall)

#創(chuàng)建正則表達(dá)式對象 pattern = re.compile('正則表達(dá)式',re.S) list02 = pattern.findall(html)

舉個例子

代碼:

import res01 = 'abchfgasca\nc' list01 = re.findall('a.c', s01, re.S) print(list01) print('-'*15)pattern = re.compile('a.c') list02 = pattern.findall(s01) print(list02)

結(jié)果:

['abc', 'asc', 'a\nc'] --------------- ['abc', 'asc']

正則表達(dá)式元字符

元字符的詳細(xì)知識點(diǎn),具體看正則表達(dá)式教程。

元字符含義
.匹配任意一個字符(不包括\n)
\d匹配任意數(shù)字
\s匹配空白字符
\S匹配非空白字符
*出現(xiàn)0次或多次
+出現(xiàn)1次或多次
?出現(xiàn)0次或1次
{m,n}出現(xiàn)m-n次

貪婪匹配和非貪婪匹配

貪婪和非貪婪的詳細(xì)知識點(diǎn),具體看正則表達(dá)式教程。

貪婪模式

在整個表達(dá)式匹配成功的前提下,盡可能多的匹配

非貪婪模式

在整個表達(dá)式匹配成功的前提下,盡可能少的匹配

舉個例子

要求:我想要匹配HTML頁面中三對段落標(biāo)簽

中的兔子名稱。

貪婪模式:

import rehtml = \ """<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>正則表達(dá)式</title> </head> <body><p>黑白道奇</p><p>垂耳兔</p><p>北極兔</p> </body> </html> """ pattern = re.compile(r'<p>.+</p>', re.S) list01 = pattern.findall(html) print(list01)

結(jié)果:

['<p>黑白道奇</p>\n\t<p>垂耳兔</p>\n\t<p>北極兔</p>']

貪婪模式中,列表中只匹配到了一個結(jié)果,這個結(jié)果顯然不符合我們的要求。

非貪婪模式:

import rehtml = \ """<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>正則表達(dá)式</title> </head> <body><p>黑白道奇</p><p>垂耳兔</p><p>北極兔</p> </body> </html> """ pattern = re.compile(r'<p>.+?</p>', re.S) list01 = pattern.findall(html) print(list01)

結(jié)果:

['<p>黑白道奇</p>', '<p>垂耳兔</p>', '<p>北極兔</p>']

非貪婪模式下,我們的列表中存放了3個結(jié)果,且每一對段落標(biāo)簽中都有我們的兔子名稱,基本符合我們的要求。

為啥說基本符合要求,而不是完全滿足?因?yàn)槲覀冎幌胍米用Q,不想要段落標(biāo)簽

。所以,此時,我們就要使用正則表達(dá)式中的分組來解決這個問題了!

正則表達(dá)式分組

分組的詳細(xì)知識點(diǎn),請看正則表達(dá)式教程。

作用

在完整的模式中定義子模式,將每個圓括號中的子模式匹配出來的結(jié)果提取出來。

爬蟲應(yīng)用

①在網(wǎng)頁中,想要提取什么內(nèi)容,就在正則表達(dá)式中對應(yīng)位置加()

②如果有2個及以上分組(),則結(jié)果中以元組形式顯示 [(),(),()]

舉個例子1

代碼:

import res = 'A B C D' p1 = re.compile('\w+\s+\w+') print(p1.findall(s))#1個子組 p2 = re.compile('(\w+)\s+\w+') #只輸出子組中匹配結(jié)果 print(p2.findall(s))#多個子組 p3 = re.compile('(\w+)\s+(\w+)') #按照元組形式,將各個子組中匹配結(jié)果輸出 print(p3.findall(s))

結(jié)果:

['A B', 'C D'] ['A', 'C'] [('A', 'B'), ('C', 'D')]

舉個例子2

我們有如下HTML頁面結(jié)構(gòu):

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>正則表達(dá)式</title> </head> <body><div class="animal"><p class="name"><a title="Tiger"></a></p><p class="content">Two tigers two tigers run fast</p></div><div class="animal"><p class="name"><a title="Rabbit"></a></p><p class="content">Small white rabbit white and white</p></div></body> </html>

要求:我們想要提取每個div標(biāo)簽中,段落標(biāo)簽p內(nèi),標(biāo)簽a里的title參數(shù)值【“Tiger”、“Rabbit”】和字符串【Two tigers two tigers run fast、Small white rabbit white and white】

代碼:

import rehtml = \ """ <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>正則表達(dá)式</title> </head> <body><div class="animal"><p class="name"><a title="Tiger"></a></p><p class="content">Two tigers two tigers run fast</p></div><div class="animal"><p class="name"><a title="Rabbit"></a></p><p class="content">Small white rabbit white and white</p></div></body> </html> """pattern1 = re.compile(r'<div class="animal">.+?<p class="name">.+?<a title=(.+?)></a>', re.S) pattern2 = re.compile(r'<div class="animal">.+?<p class="content">(.+?)</p>', re.S)s01 = pattern1.findall(html) s02 = pattern2.findall(html)print(s01) print(s02)

結(jié)果:

['"Tiger"', '"Rabbit"'] ['\n\t\t\tTwo tigers two tigers run fast\n\t ', '\n\t\t\tSmall white rabbit white and white\n\t ']

當(dāng)然,可以把兩個子組放在一個正則表達(dá)式中,那么輸出結(jié)果,就是一個包含兩個元祖的列表。在這里,我就不寫了,大家可以自己試一下。

現(xiàn)在我們從列表里拿出我們的值,并將值左右兩側(cè)的空格去掉:

for item01, item02 in zip(s01, s02):print('動物名稱:', item01.strip())print('動物描述:', item02.strip())

結(jié)果:

動物名稱: "Tiger" 動物描述: Two tigers two tigers run fast 動物名稱: "Rabbit" 動物描述: Small white rabbit white and white

總結(jié)

以上是生活随笔為你收集整理的利用python爬虫(part3)--正则表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。