爬虫 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

 

 

         

 

posted @ 2018-06-08 20:53  Eunuch_Li  阅读(754)  评论(0编辑  收藏  举报