爬蟲數據提取方式的一種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