换行导致的python爬虫爬取的html错误

时间:5个月前   阅读:1533

在最近的 python 爬虫中,爬取的 html 中有这样的数据段需要提取:

<a href="http://www.example.cn/demo.htm" target="_blank">标题</a>
                                
                                    
                                    
                                        <span class="date">2019.10.27 </span>

(注:复制到文档时因为编辑器缘故将制表符替换为空格了,其实行之间为制表符)

刚开始处理时,因为对正则的不熟练,直接硬匹配:

pattern = r'<a href="(.*?)" target="_blank">(.*?)</a>\n\t{8}\n\t{9}\n\t{9}\n\t{10}<span class="date">(.*?) </span>'

但是在爬取时出现了问题,即首次爬取 html 源码时匹配不出数据,但等到第二次往后从缓存中读取时,数据就能正常返回了。

思考了很久,有两个怀疑的原因:1. 爬取网页后直接使用的变量和从文件读取出的文本变量的数据类型不同;2. 换行符在 Windows 和 macOS 系统中不同导致的问题。

第一个怀疑比较好验证,在合适的时候使用 typeof 即可,但我认为换行符的嫌疑更大,所以没具体测试。

第二个将原先正则替换为 <a href="(.*?)" target="_blank">(.*?)</a>\r\n\t{8}\r\n\t{9}\r\n\t{9}\r\n\t{10}<span class="date">(.*?) </span> (即将原先的 \n 换为 \r\n)时进行测试,果然,数据可以正常爬取了。

在查阅资料的过程中,也了解到了另一个匹配关键词,即 \s,其可匹配任意空白符号,包括空格制表符等等,所以最后的正则如下:

pattern = r'<a href="(.*?)" target="_blank">(.*?)</a>\s{40,44}<span class="date">(.*?) </span>'

All done.

版权声明:本文为期权记的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.qiquanji.com/post/4627.html

上一篇:树莓派安装 CentOS完整教程,添加 EPEL 软件源

下一篇:傻瓜式教程:树莓派安装 ArchLinuxArm系统

网友评论

请先 登录 再评论,若不是会员请先 注册