首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

享学课堂浅谈Python3爬虫之入门和正则表达式

python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享;爬虫说的简单,就是去抓取网路的数据进行分析处理;这章主要入门,了解几个爬虫的小测试,以及对爬虫用到的工具介绍,比如集合,队列,正则表达式.

一、用python抓取指定页面:

代码如下:

查找可变网址:

二、python正则表达式介绍:

1.队列介绍:在爬虫的程序中用到了广度优先级算法,该算法用到了数据结构,当然你用list也可以实现队列,但是效率不高。现在在此处介绍下:

在容器中有队列:collection.deque

#队列简单测试:fromcollectionsimportdequequeue=deque(["peace","rong","sisi"])queue.append("nick")queue.append("pishi")print(queue.popleft())print(queue.popleft())print(queue)

2.集合介绍:在爬虫程序中,为了不重复爬那些已经爬过的网站,我们需要把爬过的页面的url放进集合中,在每一次要爬某一个url之前,先看看集合里面是否已经存在。如果已经存在,我们就跳过这个url;如果不存在,我们先把url放入集合中,然后再去爬这个页面。

Python还包含了一个数据类型——set(集合)。集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。集合对象还支持union(联合),intersection(交),difference(差)和sysmmetricdifference(对称差集)等数学运算。

大括号或set()函数可以用来创建集合。注意:想要创建空集合,你必须使用set()而不是{}。{}用于创建空字典;

3.集合的创建演示如下:

a={"peace","peace","rong","rong","nick"}print(a)"peace"inab=set(["peace","peace","rong","rong"])print(b)#演示联合print(a|b)#演示交print(a&b)#演示差print(a-b)#对称差集print(a^b)#输出:{'peace','rong','nick'}{'peace','rong'}{'peace','rong','nick'}{'peace','rong'}{'nick'}{'nick'}

4.正则表达式:在爬虫时收集回来的一般是字符流,我们要从中挑选出url就要求有简单的字符串处理能力,而用正则表达式可以轻松的完成这一任务;正则表达式的步骤:

正则表达式的编译

正则表达式匹配字符串

结果的处理

下图列出了正则表达式的语法:

在python中使用正则表达式,需要引入re模块;下面介绍下该模块中的一些方法;

1.compile和match:re模块中compile用于生成pattern的对象,再通过调用pattern实例的match方法处理文本最终获得match实例;通过使用match获得信息;

importre#将正则表达式编译成Pattern对象pattern=re.compile(r'rlovep')#使用Pattern匹配文本,获得匹配结果,无法匹配时将返回Nonem=pattern.match('rlovep.com')ifm:#使用Match获得分组信息print(m.group())###输出####rlovep

re.compile(strPattern[,flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。第二个参数flag是匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I|re.M。另外,你也可以在regex字符串中指定模式,比如re.compile(‘pattern’,re.I|re.M)与re.compile(‘(?im)pattern’)是等价的。

可选值有:

re.I(re.IGNORECASE):忽略大小写(括号内是完整写法,下同)

M(MULTILINE):多行模式,改变’^’和’$’的行为(参见上图)

S(DOTALL):点任意匹配模式,改变’.’的行为

L(LOCALE):使预定字符类wWbBsS取决于当前区域设定

U(UNICODE):使预定字符类wWbBsSdD取决于unicode定义的字符属性

X(VERBOSE):详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

2、Match:Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。

属性:string:匹配时使用的文本。re:匹配时使用的Pattern对象。pos:文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。endpos:文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。lastindex:最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。lastgroup:最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。方法:group([group1,…]):获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。groups([default]):以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。groupdict([default]):返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。start([group]):返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。end([group]):返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。span([group]):返回(start(group),end(group))。expand(template):将匹配到的分组代入template中然后返回。template中可以使用id或g、g引用分组,但不能使用编号0。id与g是等价的;但10将被认为是第10个分组,如果你想表达1之后是字符'0',只能使用g0。

Pattern:

Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。

Pattern不能直接实例化,必须使用re.compile()进行构造。

Pattern提供了几个可读属性用于获取表达式的相关信息:pattern:编译时用的表达式字符串。flags:编译时用的匹配模式。数字形式。groups:表达式中分组的数量。groupindex:以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。实例方法[|re模块方法]:match(string[,pos[,endpos]])|re.match(pattern,string[,flags]):这个方法将从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。pos和endpos的默认值分别为0和len(string);re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。注意:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。search(string[,pos[,endpos]])|re.search(pattern,string[,flags]):这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;若无法匹配,则将pos加1重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。pos和endpos的默认值分别为0和len(string));re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。split(string[,maxsplit])|re.split(pattern,string[,maxsplit]):按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。findall(string[,pos[,endpos]])|re.findall(pattern,string[,flags]):搜索string,以列表形式返回全部能匹配的子串。finditer(string[,pos[,endpos]])|re.finditer(pattern,string[,flags]):搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。sub(repl,string[,count])|re.sub(pattern,repl,string[,count]):使用repl替换string中每一个匹配的子串后返回替换后的字符串。当repl是一个字符串时,可以使用id或g、g引用分组,但不能使用编号0。当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。count用于指定最多替换次数,不指定时全部替换。subn(repl,string[,count])|re.sub(pattern,repl,string[,count]):返回(sub(repl,string[,count]),替换次数)。

3.re.match(pattern,string,flags=0)

函数参数说明:

匹配成功re.match方法返回一个匹配的对象,否则返回None。

我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式。

演示如下:

实例二:使用group

importreline="Thisismyblog"#匹配含有is的字符串matchObj=re.match(r'(.*)is(.*?).*',line,re.M|re.I)#使用了组输出:当group不带参数是将整个匹配成功的输出#当带参数为1时匹配的是最外层左边包括的第一个括号,一次类推;ifmatchObj:print("matchObj.group():",matchObj.group())#匹配整个print("matchObj.group(1):",matchObj.group(1))#匹配的第一个括号print("matchObj.group(2):",matchObj.group(2))#匹配的第二个括号else:print("Nomatch!!")#输出:matchObj.group():ThisismyblogmatchObj.group(1):ThismatchObj.group(2):my

4.re.search方法

re.search扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern,string,flags=0)

函数参数说明:

匹配成功re.search方法返回一个匹配的对象,否则返回None。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171212A0Z5DH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券