使用正则表达式抓取数据时遇到的小问题
本次目标时用正则表达式抓取一个网站的歌曲排行榜
部分源代码如下:
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给替换成空字符串
然后再按照原来写的正则表达式来抓取
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】