Python爬虫学习(四)正则表达式
经过前面的学习之后,大家现在应该可以顺利地得到一个网页源码字符串,对于Python中的字符串,Python提供了很多操作,大家可以其去尝试提取网页源码字符串中想要的信息。在这里,给大家推荐的是正则表达式!
文章最后还有爬取糗事百科的实例哦!
什么是正则表达式
说白了,正则表达式就是描述我们需要提取的那部分信息的规则的工具。
举个栗子,比如,我们想要提取'Stay hungry, 123 stay foolish!'
中的那部分数字,可以使用(\d+)
这个式子来表达。
学习正则表达式
正则表达式的学习,差不多就是在学习它的元字符:
元字符以上图片来自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
稍微看一下上面的图表,相信大家已经有点明白怎么回事了,如果想要更详细的学习资料,推荐:
正则表达式必知必会都可以让你轻松入门!
使用re库
re 使 Python 语言拥有全部的正则表达式功能,那么我们就使用re库来演示一波!
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None。
函数语法:
re.match(pattern, string, flags=0)
- pattern 匹配的正则表达式
- string 要匹配的字符串。
- flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
- group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
- groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
实例
re.search函数
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
re.search(pattern, string, flags=0)
- pattern 匹配的正则表达式
- string 要匹配的字符串。
- flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。
匹配成功re.match方法返回一个匹配的对象,否则返回None。
我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
- group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
- groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
实例
标志位
正则表达式可以包含一些可选标志修饰符来控制匹配的模式,也就是在前面提到的flags标志位的可选参数。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:
re.compile函数
有时候,我们可能会在代码中大量重复使用相同的模式,这时我们可以将正则字符串编译成正则对象,以便于复用该匹配模式。
一次编译,到处使用!
当然,re库中还有好多其他内容,可以查看:https://docs.python.org/3/library/re.html
爬取糗事百科首页
首先,来到糗事百科,然后审查一下元素,如下图:
定位源码
我们可以发现,每个段子似乎都在一个<div class="content">……</div>
标签中,于是,有了一个大胆的想法。
我们使用urllib库获取到网页源码字符串后,就可以使用刚学的正则表达式把段子提取出来了。
可是,段子这么多,之前学过的各种函数re.search
、re.match
什么的,只可以提取到一个匹配结果呀。没错,于是我们使用re.findall
,可以提出到所有的匹配结果。
问题都差不多解决了,下面开始动手:
nice!段子来了!!!
当然,你可以给上面的代码进行修改,比如加入异常处理,更好的组织等等。
以上。