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

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

部分源代碼以下:函數

 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全出來了,但這個網站設了幾點難點給我。spa

第一:code

 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>

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

解決方法:blog

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

 

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

解決方法:input

利用轉義符   \

 

之後遇到相似的排名網站能夠,好比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給替換成空字符串

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

相關文章
相關標籤/搜索