利用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)--正则表达式的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 利用python爬虫(part2)--u
- 下一篇: python之csv模块(part1)-