200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 网络爬虫-re库-正则表达式

网络爬虫-re库-正则表达式

时间:2019-06-23 03:49:33

相关推荐

网络爬虫-re库-正则表达式

re库主要是用来简洁表达一组字符串特征的表达式。最主要应用在字符串匹配中。这也是在爬虫中经常用到的工具。

正则表达式语法

正则表达式语法由字符和操作符组成。

re.match()

re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功,match就返回none

常规匹配

content="yangkezhenshuai 888 666 shuai"result=re.match('^yangkezhenshuai\s\d\d\d\s\d{3}\s.*',content)#\s表示空格;\d表示数字;\d{4}表示连着的4个数字;.*表示匹配接下来的所有字符print(result)print(result.group())#输出匹配的字符串

<_sre.SRE_Match object; span=(0, 29), match=‘yangkezhenshuai 888 666 shuai’>

yangkezhenshuai 888 666 shuai

泛匹配

直接用.*来匹配。

content="yangkezhenshuai 888 666 shuai"result=re.match('.*',content)# .*表示匹配接下来的所有字符print(result)

<_sre.SRE_Match object; span=(0, 29), match=‘yangkezhenshuai 888 666 shuai’>

匹配目标

假设我们要匹配 888

content="yangkezhenshuai 888 666 shuai"result=re.match('^yangkezhenshuai\s(\d+)\s',content)#((\d+))表示把888分为一组print(result.group(1))

888

也可以写成以下面这种形式

content="yangkezhenshuai 888 666 shuai"result=re.match('yangkezhenshuai.*?(\d+).*',content)# .*后面加?为非贪婪匹配模式,可以得到最先出现的数字888print(result.group(1))

非贪婪匹配就是尽可能匹配少的字符。当.*?匹配到hello后面的空白字符时,再往后的字符就是数字了,而\d+恰好可以匹配,那么这里.?就不再进行匹配,交给\d+去匹配后面的数字。所以这样,?匹配了尽可能少的字符,\d+ 的结果就是

如果出现换行符的话就无法匹配,需要加re.S。如果出现特殊字符如$需要加\,即$\。

re.search()

匹配时会扫描整个字符串,然后返回第一个成功匹配的结果;

re.search与re.match的比较:

content = "yangkezhenshuai 666 888 nimenjuedene 666 888"result = re.match('nimenjuedene.*?(\d+).*?',content)print(result)

None

此时返回结果为空。

import recontent = "yangkezhenshuai 666 888 nimenjuedene 666 888"result = re.search('nimenjuedene.*?(\d+). *?',content)print(result.group(1))

666

从上面的匹配结果可以看到,re.match必须从字符串的头部开始匹配,因此,为了匹配方便,我们尽量能用re.search就不用re.match。

例子:

给出一个html代码

result = re.search('<div.*?/5.mp3.*?singer="(.*?)">(.*?)</a>',html,re.S)#加换行符才能读取换行的数据if result:print(result.group(1),result.group(2))

陈慧琳 记事本

re.findall()

搜索字符串,并以列表的形式返回所有的匹配结果对象,而每一个结果对象都一个元组的形式存在的。

results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>',html,re.S)print(results)

[(’/2.mp3’, ‘任贤齐’, ‘沧海一声笑’), (’/3.mp3’, ‘齐秦’, ‘往事随风’), (’/4.mp3’, ‘beyond’, ‘光辉岁月’), (’/5.mp3’, ‘陈慧琳’, ‘记事本’), (’/6.mp3’, ‘邓丽君’, ‘但愿人长久’)]

通过上面的方式,我们可以看到,第一首歌因为它的歌名的超链接href不存在,因此整个信息都没匹配出来,

因此我们需要寻找一种方式:既能匹配有的结果,又能匹配没有的结果,即表示,有没有都能匹配出来。

此时我们可以用()?来表示匹配的元组数据,?表示前面的数据有没有都可以,如果是单独的字符的话,可以指定单独的字符,比如a?,或者是a*?,()?,() * ?,都可以,如果是空格或者是换行符的话可以使用\s*?来表示。

results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)?(</a>)?\s*?</li>',html,re.S)#注:换行可以用\s表示,*表示一个或多个之前的元素,?可以表示有还是没有,()内的内容可以表示为有或者没有,print(results)print(type(results)) #此时我们可以看到,这是一个列表的形式,<class 'list'>for result in results:print(result) #此时可以看到,每一个结果都是元组的形式print(result[1]) #此时我们可以通过每一个元组的位置参数取出元组中的第二个位置中的歌名的信息。

[(’’, ‘一路上有你’, ‘’), (’’, ‘沧海一声笑’, ‘’), (’’, ‘往事随风’, ‘’), (’’, ‘光辉岁月’, ‘’), (’’, ‘记事本’, ‘’), (’’, ‘但愿人长久’, ‘’)]

<class ‘list’>

一路上有你

沧海一声笑

往事随风

光辉岁月

记事本

但愿人长久

re.sub()

替换字符串中每一个匹配的子串后返回替换的子串

content="yangkezhenshuai 888 666 shuai"result=re.sub('\d+','wohenshuai',content)#((\d+))表示把888分为一组print(result)

yangkezhenshuai wohenshuai wohenshuai shuai

把888 和 666替换为了wohenshuai。

在数字子串后面加数字:

content="yangkezhenshuai 888 666 shuai"result=re.sub('(\d+)',r'\1 2910',content)#((\d+))表示把888分为一组print(result)

yangkezhenshuai 888 2910 666 2910 shuai

使用re.sub结合re.findall结合使用:

我们可以先用re.sub将原来的a标签删除替换掉

html = re.sub('<a.*?>|</a>',"",html)#这个地方a标签中间的|表示与,表示两者内容都替换,print(html)

然后再用re.findall来提取歌名

results = re.findall('<li.*?>(.*?)</li>',html,re.S)print(results)print(type(results))for result in results:print(result.strip()) #strip去掉换行符

一路上有你

沧海一声笑

往事随风

光辉岁月

记事本

但愿人长久

pile()

将正则字符串编译成正则表达式对象,以便复用该匹配模式。

content='yangkehenshuai 666 888'pattern=pile('yang.*?888')result=re.match(pattern,content)print(result)

<_sre.SRE_Match object; span=(0, 22), match=‘yangkehenshuai 666 888’>

其结果与result=re.match(‘yang.*?888’,content)相同,只不过前者可以复用。

下面简单来一个用re和requests库进行的豆瓣读书爬虫:

在这里主要爬取超链接、书名、作者、出版日期四个信息。

import requestsimport recontent=requests.get('/').textpattern=pile('<li.*?href="(.*?)".*?title="(.*?)".*?more-meta.*?"author">(.*?)</span>.*?year">(.*?)</span>.*?</li>',re.S)results=re.findall(pattern,content)print(results)

结果是list形式。

[(‘/favicon.ico’, ‘白色的虹’, '\n [苏] 康·帕乌斯托夫斯基\n ', '\n -3\n '), (‘/subject/30398401/?icn=index-latestbook-subject’, ‘科举’, '\n [日] 宫崎市定\n ', '\n -1\n '), (‘/subject/27192519/?icn=index-latestbook-subject’, ‘星新一少年科幻’, '\n [日] 星新一\n ', '\n -1\n '), (‘/subject/30389969/?icn=index-latestbook-subject’, ‘女性与权力’, '\n [英] 玛丽·比尔德/Mary Beard\n ', '\n -2\n '), (‘/subject/27661601/?icn=index-latestbook-subject’, ‘飞魂’, '\n [日]多和田叶子\n ', '\n -1-1\n '), (‘/subject/30403440/?icn=index-latestbook-subject’, ‘见字如来’, '\n 张大春\n ', '\n -1\n '), (‘/subject/30255971/?icn=index-latestbook-subject’, ‘闪闪发光的人生’, '\n [日]小川糸\n ', '\n -1-31\n '), (‘/subject/30421950/?icn=index-latestbook-subject’, ‘金犀牛’, '\n [法] F.,富威尔-艾玛尔\n ', '\n -1\n '), (‘/subject/30424482/?icn=index-latestbook-subject’, ‘中国年度科幻小说’, '\n 星河/王逢振\n ', '\n -1\n '), (‘/subject/30417612/?icn=index-latestbook-subject’, ‘非对称风险’, '\n 【美】纳西姆▪尼古拉斯▪塔勒布(Nassim Nicholas Taleb)\n ', '\n -1-1\n '), (‘/subject/30324570/?icn=index-latestbook-subject’, ‘关于同一个男人简单生活的想象’, '\n [丹]海勒·海勒\n ', '\n -1-1\n '), (‘/subject/30349093/?icn=index-latestbook-subject’, ‘北欧神话’, '\n [英]卡罗琳·拉灵顿\n ', '\n -1\n '), (‘/subject/30338148/?icn=index-latestbook-subject’, ‘火的记忆3’, '\n [乌拉圭] 爱德华多·加莱亚诺\n ', '\n -2-1\n '), (‘/subject/30360494/?icn=index-latestbook-subject’, ‘物体系’, '\n [法]让·鲍德里亚\n ', '\n -1\n '), (‘/subject/30218241/?icn=index-latestbook-subject’, ‘建筑师’, '\n (美) 大卫·马祖凯利\n ', '\n -2-1\n '), (‘/subject/30288497/?icn=index-latestbook-subject’, ‘过剩之地’, '\n [美]莫妮卡·普拉萨德\n ', '\n -1-1\n '), (‘/subject/30421604/?icn=index-latestbook-subject’, ‘速求共眠’, '\n 阎连科\n ', '\n -1\n '), (‘/subject/28867161/?icn=index-latestbook-subject’, ‘康德与鸭嘴兽’, '\n [意]埃科(Umberto Eco)\n ', '\n -1-31\n '), (‘/subject/30431098/?icn=index-latestbook-subject’, ‘对着天空散漫射击’, '\n 李柳杨\n ', '\n -3\n '), (‘/subject/30260382/?icn=index-latestbook-subject’, ‘何为“成田”’, '\n [日] 宇泽弘文\n ', '\n -1\n '), (‘/subject/30398399/?icn=index-latestbook-subject’, ‘死亡终局’, '\n [英] 阿加莎·克里斯蒂\n ', '\n -1\n '), (‘/subject/30412497/?icn=index-latestbook-subject’, ‘一个观点,不一定对’, '\n 黄章晋\n ', '\n -1-15\n '), (‘/subject/30357892/?icn=index-latestbook-subject’, ‘童话中人:动物农场’, '\n [美]比尔•威灵翰 著/[美]马库斯·白金汉\n ', '\n -1\n '), (‘/subject/30415666/?icn=index-latestbook-subject’, ‘新艺术的震撼’, '\n [澳] 罗伯特·休斯\n ', '\n -1\n '), (‘/subject/28867027/?icn=index-latestbook-subject’, ‘圆屋’, '\n [美]厄德里克(Louise Erdrich)\n ', '\n -1\n '), (‘/subject/30416747/?icn=index-latestbook-subject’, ‘如何正确吵架’, '\n [美] 朱迪斯·莱特/鲍勃·莱特\n ', '\n -3\n '), (‘/subject/30443695/?icn=index-latestbook-subject’, ‘像火焰像灰烬’, '\n 程姬\n ', '\n -1\n '), (‘/subject/30414788/?icn=index-latestbook-subject’, ‘通识’, '\n 日本实业出版社/[日] 茂木健一郎 主编\n ', '\n -2\n '), (‘/subject/30217957/?icn=index-latestbook-subject’, ‘白河夜船’, '\n [日] 吉本芭娜娜\n ', '\n -1\n '), (‘/subject/30322990/?icn=index-latestbook-subject’, ‘拜占庭帝国史’, '\n [美] A.A.瓦西列夫\n ', '\n -1\n '), (‘/subject/30323006/?icn=index-latestbook-subject’, ‘在地图结束的地方’, '\n [美]保罗·奥斯特\n ', '\n -12\n '), (‘/subject/30434839/?icn=index-latestbook-subject’, ‘我的瓦格纳人生’, '\n [德]克里斯蒂安·蒂勒曼(Christian Thielemann)/克里斯蒂·莱姆克-马特维(Christine Lemke-Matwey)\n ', '\n -1\n '), (‘/subject/30258608/?icn=index-latestbook-subject’, ‘乳房’, '\n [美] 菲利普·罗斯\n ', '\n -1-24\n '), (‘/subject/30428109/?icn=index-latestbook-subject’, ‘五胡十六国’, '\n [日]三崎良章\n ', '\n -1\n '), (‘/subject/30344071/?icn=index-latestbook-subject’, ‘雨狗空间’, '\n 卧斧\n ', '\n -2\n '), (‘/subject/30219714/?icn=index-latestbook-subject’, ‘生命是什么’, '\n [以色列]埃迪·普罗斯\n ', '\n -12-1\n '), (‘/subject/30457133/?icn=index-latestbook-subject’, ‘读心师’, '\n 向林\n ', '\n -2-1\n '), (‘/subject/30394583/?icn=index-latestbook-subject’, ‘艺术精神’, '\n [美] 罗伯特·亨利\n ', '\n -1-1\n '), (‘/subject/30410349/?icn=index-latestbook-subject’, ‘中国侦探推理小说精选’, '\n 韩璇 选编/张蓉/铁血阿郎/贺清华/宜铭/王珂/顾建平/漆雕醒/香无/易诺/拟南芥/寒汐/轩弦/河狸/杜辉/阿真\n ', '\n -1\n '), (‘/subject/30406461/?icn=index-latestbook-subject’, ‘微精通’, '\n [英] 罗伯特·特威格尔\n ', '\n -1\n ')]

for result in results:url,name,author,date=result#author=re.sub('\s','',author) #把换行符去掉和strip()的效果相同#date=re.sub('\s','',date) #把换行符去掉和strip()的效果相同print(url,name,author.strip(),date.strip())

效果如下:

/subject/30324570/?icn=index-latestbook-subject 关于同一个男人简单生活的想象 [丹]海勒·海勒 -1-1

/subject/30349093/?icn=index-latestbook-subject 北欧神话 [英]卡罗琳·拉灵顿 -1

/subject/30338148/?icn=index-latestbook-subject 火的记忆3 [乌拉圭] 爱德华多·加莱亚诺 -2-1

/subject/30360494/?icn=index-latestbook-subject 物体系 [法]让·鲍德里亚 -1

/subject/30218241/?icn=index-latestbook-subject 建筑师 (美) 大卫·马祖凯利 -2-1

/subject/30288497/?icn=index-latestbook-subject 过剩之地 [美]莫妮卡·普拉萨德 -1-1

/subject/30421604/?icn=index-latestbook-subject 速求共眠 阎连科 -1

/subject/28867161/?icn=index-latestbook-subject 康德与鸭嘴兽 [意]埃科(Umberto Eco) -1-31

/subject/30431098/?icn=index-latestbook-subject 对着天空散漫射击 李柳杨 -3

/subject/30260382/?icn=index-latestbook-subject 何为“成田” [日] 宇泽弘文 -1

/subject/30398399/?icn=index-latestbook-subject 死亡终局 [英] 阿加莎·克里斯蒂 -1

/subject/30412497/?icn=index-latestbook-subject 一个观点,不一定对 黄章晋 -1-15

/subject/30357892/?icn=index-latestbook-subject 童话中人:动物农场 [美]比尔•威灵翰 著/[美]马库斯·白金汉 -1

/subject/30415666/?icn=index-latestbook-subject 新艺术的震撼 [澳] 罗伯特·休斯 -1

/subject/28867027/?icn=index-latestbook-subject 圆屋 [美]厄德里克(Louise Erdrich) -1

/subject/30416747/?icn=index-latestbook-subject 如何正确吵架 [美] 朱迪斯·莱特/鲍勃·莱特 -3

/subject/30443695/?icn=index-latestbook-subject 像火焰像灰烬 程姬 -1

……………………………………………………………………

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。