爬虫 re 模块 (正则表达式)
爬虫数据提取方式的一种
re:是用于提起字符串内容的模块
我们用到的方法有:
re.compile() 创建正则正则对象
re.findall() 匹配查找,返回的是列表
re.S 可以将正则的搜索域不在是一行,而是整个html字符串
分为三个步骤:
一、创建正则对象
二、匹配查找
三、提取数据保存
先导入模块re
import re
我们先创建个字符串
string = """ <div class="body"> <div> <a href="www.baidu.com" >百度一下</a> <li> <a class="zhiyou" href="www.zhiyou100.com">智游教育</a> </li> </div> <div class="one" style="color: red"> <span>这是第一条数据</span> </div> <div class="two" style="color: blue"> <span class="two_one"></span> <span>这是第二条数据</span> </div> <span class="three" style="color: black">这是第三条数据</span> </div> """
写正则表达式,创建正则对象
pattern = re.compile(r'<a href="(.*?)">(.*?)</a>',re.S)
如果不加 pattern = re.compile('<a href="(.*?)">(.*?)</a>') 只会查找第一行的字符串,因为返回的字符串都有空格,所以要加re.S
.*?是跳过的意思,因为一般情况下属性有很多,无关的可以用.*?跳过 或者匹配到一个数据后与第二个数据很远就跳过
(.*?) 加括号的意思是,匹配括号里的数据,也就是取出数据,可以取多个数据.
返回的是一个列表,如果匹配到多组数据,每一组数据都是一个元组,每一个元组都是由表达式取出的(.*?)组成
正则表达式的一些个人观点
我们是在字符串中匹配数据的,所以表达式要和html中的格式一样,比如属性后是双引号,属性之间有一个空格,如果不一样,也会匹配不到.
要匹配的数据的标签有唯一的属性就可以直接指定,如果找不到,就说明标签太深了,正则表达式匹配不到,也会找不到,就找父类.
当匹配到数据时要用结束标签,如果没有就有可能连后面无关的数据也匹配到
提取数据
res = re.findall(pattern,string) print(res)
第一个参数是正则表达式对象,第二个参数是目标字符串
补充
.*? 是非贪婪匹配
.* 是贪婪匹配
举例
string = "a111111b222222b333333b"
a.*?b 贪婪匹配 的 结果是 a111111b
a.*b 非贪婪匹配的结果是 a111111b222222b333333b