爬虫数据提取方式的一种html
re:是用于提起字符串内容的模块正则表达式
咱们用到的方法有:spa
re.compile() 建立正则正则对象code
re.findall() 匹配查找,返回的是列表htm
re.S 能够将正则的搜索域不在是一行,而是整个html字符串对象
分为三个步骤:blog
1、建立正则对象three
2、匹配查找字符串
3、提取数据保存string
先导入模块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