1. 程式人生 > >使用正則表達式抓取數據時遇到的小問題

使用正則表達式抓取數據時遇到的小問題

input 正則表達式 並且 pri 問題 spa findall 解決 val

本次目標時用正則表達式抓取一個網站的歌曲排行榜

部分源代碼如下:

 1 <li>
 2 <input type="checkbox" value="69933@" name="Url" class="check">
 3 <span class="songNum ">38.</span>
 4 <a target="_1" href="/play/69933.htm" class="songName ">美麗的神話 《神話》電影主題曲 </a>
 5 </li>
 6 <li>
 7 <
input type="checkbox" value="42474@" name="Url" class="check"> 8 <span class="songNum ">39.</span> 9 <a target="_1" href="/play/42474.htm" class="songName ">過火 </a> 10 </li> 11 <li> 12 <input type="checkbox" value="49771@" name="Url" class="check"> 13 #<
span class="songNum ">40.</span> 14 <a target="_1" href="/play/49771.htm" class="songName ">一生愛你千百回 </a> 15 </li>

可以看到,每一個<li>標簽裏存著一首歌的信息,包括,排名,地址,歌名。

按道理來說,寫個正則匹配直接findall全出來了,但這個網站設了幾點難點給我。

第一:

 1 <li>
 2 <input type="checkbox" value="11417@" name="Url"
class="check"> 3 <span class="songNum topRed">01.</span> 4 <a target="_1" href="/play/11417.htm" class="songName cBlue">大海 </a> 5 </li> 6 <li> 7 <input type="checkbox" value="64541@" name="Url" class="check"> 8 <span class="songNum topRed">02.</span> 9 <a target="_1" href="/play/64541.htm" class="songName ">天路 </a> 10 </li> 11 <li> 12 <input type="checkbox" value="65937@" name="Url" class="check"> 13 <span class="songNum topRed">03.</span> 14 <a target="_1" href="/play/65937.htm" class="songName ">再回首 </a> 15 </li>

第一、二、三名的歌曲在songNum後面加了 topRed,還有在第一名的songName後面加了個cBlue。

解決方法:

在寫正則表達式時在相應的地方加上:(topRed)? 和(cBlue)? ,()表示把字符歸為一組,?表示匹配0個或者1個,也就是說,有的或者沒有的都能匹配到,並且存儲在組裏。

第二:在每個排名的後面加了一個點。比如03.

解決方法:

利用轉義符 \

以後遇到類似的排名網站可以,比如op.gg,就能用這個方法解決了。

代碼:

results = re.findall(<li>.*?songNum (topRed)?">(.*?)\..*?href="(.*?)".*?songName (cBlue)?">(.*?)</a>,string,re.S)
for result in results:
    print(result[1],result[2],result[4])

遇到第二種解決方法了:

results = re.sub(topRed,‘‘,string)
results1 = re.sub(cBlue,‘‘,results)
results2 = re.findall(<li>.*?songNum ">(.*?)\..*?href="(.*?)".*?songName ">(.*?)</a>,results1,re.S)
for result in results2:
    print(result[0],result[1],result[2])

用sub函數把topRed和cBlue給替換成空字符串

然後再按照原來寫的正則表達式來抓取

使用正則表達式抓取數據時遇到的小問題