02.25 Python爬虫分享:使用正则表达式巧妙的解析网页,包你学以致用

前两天小编整理一份爬虫的资料,不知道大家伙是否还记得,这一次小编结合所学习的内容,跟大家分享分享。

大家可以给小编提提意见,今天主要分享的是使用正则表达式解析网页。

Python爬虫是非常重要的板块,学起来刚开始有一些迷茫,慢慢的熟悉之后就变成“老司机”,相信刚开始学习python的小伙伴也能和小编一样,可以学着自己分享一下一些东西。

每一个上班族或者就算宅在家的人,每天都需要打开网页搜索资料,所以今天我们就利用Python爬虫,来解析网页。

Python爬虫分享:使用正则表达式巧妙的解析网页,包你学以致用

话不多少,下面正式开始分享

认识正则表达式

正则表达式就是对字符串进行操作的逻辑公式,相当于‘过滤’这个字符串。

一开始学习可能是懵懂的,小编就是这样,后来一直不停的复习,总算是学会了。

常用的正则表达式

单字符:

. : 除换行以外所有字符

[] :[aoe] [a-w] 匹配集合中任意一个字符

\\d :数字 [0-9]

\\D : 非数字

\\w :数字、字母、下划线、中文

\\W : 非\\w

\\s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \\f\\n\\r\\t\\v]。

\\S : 非空白

数量修饰:

* : 任意多次 >=0

+ : 至少1次 >=1

? : 可有可无 0次或者1次

{m} :固定m次 hello{3,}

{m,} :至少m次

{m,n} :m-n次

边界:

$ : 以某某结尾

^ : 以某某开头

分组:

(ab)

贪婪模式: .*

非贪婪(惰性)模式: .*?

re.I : 忽略大小写

re.M :多行匹配

re.S :单行匹配

re.sub(正则表达式, 替换内容, 字符串)

Python爬虫分享:使用正则表达式巧妙的解析网页,包你学以致用

re.match方法

这里直接来讲解正则表达式的re.match方法:

先上一批代码:

import re

test=re.match('www','www.baidu.com')

print('result:',test)

print('begin and end tuple:',test.span())

print('begin:',test.start())

print('end:',test.end())

利用re.match方法,结果为:

result: <re.match>

begin and end tuple:(0, 3)

begin:0

end:3

span()是匹配结果的开始位置和结束位置

start()和end()则是分别开始和结束。

下面试着把pattern进行一些改变:

import re

pattern='Cats are smarter than dogs'

test=re.match(r'(.*) are (.*?) dogs',pattern)

print('the whole sentence:',test.group(0))

print('the first result:',test.group(1))

print('the second result:',test.group(2))

print('a tuple for result:',test.groups())

最终结果,你会得到:

the whole sentence: Cats are smarter than dogs

the first result: Cats

the second result: smarter than

a tuple for result: ('Cats', 'smarter than')

注意:r表示纯字符,防止反斜杠转译。

()里面小编这里用的是嵌入正则表达式,所以就最后匹配了Cats和smarter than。

Python爬虫分享:使用正则表达式巧妙的解析网页,包你学以致用

re.search方法

re.match只从字符串开始进行匹配,请看下面代码:

import re

link='www.baidu.com'

print(re.match('baidu',link))

print(re.search('baidu',link))

结果显示:

None

<re.match>

从这里就可以看到,这两者的区别,match发现开头没有就直接返回None了,而search则从头扫描到尾。

Python爬虫分享:使用正则表达式巧妙的解析网页,包你学以致用

re.findall方法

这个就是比较牛掰的方法,也是小编常用的,因为它可以找到所有的匹配。比如:

import re

link='www.baidu.com www.baidu,com'

print(re.match('www',link))

print(re.search('www',link))

print(re.findall('www',link))

结果如下:

<re.match>

<re.match>

['www', 'www']

我们可以看到Match和search只能返回一个www,但是使用findall可以找到所有的哦,所以小编可以推荐大家使用re.findall方法,不过也要根据自己情况而定。

这三种方法,小编做了稍微的总结,用一句话概括:一山还比一山高。

search比Match用起来则更加灵活,findall又比前两者爬取到更多网页知识,整体学起来是不是很难,主要是需要对症下药,找到合适的匹配规则。

其实小编学习python爬虫时间并不长,在此期间加入了一个学习python的社群,天天与学习python的童鞋们交流分享,不懂的问题也有助教老师帮我们分析,所以说掌握知识很简单,如果你也想加入我们这个大家庭,欢迎来私信小编~

如果你对这篇文章感兴趣,或者你身边的人正在学习python,可以分享给朋友们一起交流学习。


分享到:


相關文章: