..
记换行导致的爬虫错误
在最近的 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.