爬虫 re 模块 (正则表达式)

爬虫数据提取方式的一种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

相关文章
相关标签/搜索