欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

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

发布时间:2023/12/19 python 36 豆豆
生活随笔 收集整理的这篇文章主要介绍了 利用python爬虫(part3)--正则表达式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

学习笔记


文章目录

    • 正则表达式
      • re模块的使用
        • 正则表达式元字符
        • 贪婪匹配和非贪婪匹配
          • 贪婪模式
          • 非贪婪模式
        • 正则表达式分组


正则表达式

re模块的使用

re模块在爬虫中常用的方法:

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

匹配方式1(re.findall)

list01=re.findall('正则表达式',html,re.S) #html就是我们获取的网页源代码字符串 #re.S为flag扩展参数,re.S表示使【.】可以匹配换行。这样【.】就可以匹配任意字符了 #返回值为包含符合正则表达式的字符串的列表

关于flag扩展参数,详细请见正则表达式教程。

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

#创建正则表达式对象 pattern = re.compile('正则表达式',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)

结果:

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

正则表达式元字符

元字符的详细知识点,具体看正则表达式教程。

元字符含义
.匹配任意一个字符(不包括\n)
\d匹配任意数字
\s匹配空白字符
\S匹配非空白字符
*出现0次或多次
+出现1次或多次
?出现0次或1次
{m,n}出现m-n次

贪婪匹配和非贪婪匹配

贪婪和非贪婪的详细知识点,具体看正则表达式教程。

贪婪模式

在整个表达式匹配成功的前提下,尽可能多的匹配

非贪婪模式

在整个表达式匹配成功的前提下,尽可能少的匹配

举个例子

要求:我想要匹配HTML页面中三对段落标签

中的兔子名称。

贪婪模式:

import rehtml = \ """<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>正则表达式</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)

结果:

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

贪婪模式中,列表中只匹配到了一个结果,这个结果显然不符合我们的要求。

非贪婪模式:

import rehtml = \ """<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>正则表达式</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)

结果:

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

非贪婪模式下,我们的列表中存放了3个结果,且每一对段落标签中都有我们的兔子名称,基本符合我们的要求。

为啥说基本符合要求,而不是完全满足?因为我们只想要兔子名称,不想要段落标签

。所以,此时,我们就要使用正则表达式中的分组来解决这个问题了!

正则表达式分组

分组的详细知识点,请看正则表达式教程。

作用

在完整的模式中定义子模式,将每个圆括号中的子模式匹配出来的结果提取出来。

爬虫应用

①在网页中,想要提取什么内容,就在正则表达式中对应位置加()

②如果有2个及以上分组(),则结果中以元组形式显示 [(),(),()]

举个例子1

代码:

import res = 'A B C D' p1 = re.compile('\w+\s+\w+') print(p1.findall(s))#1个子组 p2 = re.compile('(\w+)\s+\w+') #只输出子组中匹配结果 print(p2.findall(s))#多个子组 p3 = re.compile('(\w+)\s+(\w+)') #按照元组形式,将各个子组中匹配结果输出 print(p3.findall(s))

结果:

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

举个例子2

我们有如下HTML页面结构:

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>正则表达式</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标签中,段落标签p内,标签a里的title参数值【“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>正则表达式</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)

结果:

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

当然,可以把两个子组放在一个正则表达式中,那么输出结果,就是一个包含两个元祖的列表。在这里,我就不写了,大家可以自己试一下。

现在我们从列表里拿出我们的值,并将值左右两侧的空格去掉:

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

结果:

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

总结

以上是生活随笔为你收集整理的利用python爬虫(part3)--正则表达式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。