本次目標時用正則表達式抓取一個網站的歌曲排行榜正則表達式
部分源代碼以下:函數
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給替換成空字符串
而後再按照原來寫的正則表達式來抓取