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

相關文章
相關標籤/搜索