( 因为最近在学scrapy框架,对css和xpath选择器都不太熟悉,想用正则来提取数据,但是碰到了正则无法匹配多行的状况,之前其实也遇到,但是最后都用其他的方式将这个问题给绕过去了,今天特地在网上搜索了许多信息,最后找到了两篇文章,总结出了比较适合我的解决方法。)
举例

有这样一段文本,我想提取出a标签的style属性,并且想要将上一行的<h1>作为特征也写入正则表达式中,如果写成r.complie(r’<h1>.*<a href="/" style="(.*?)">Quotes to Scrape’)是什么都匹配不出来的,这里我找到了两种方法
方法一
第一种是尾部不加re.S,这种情况下 . 将不会匹配换行符,所以我们将h1和a标签之间的部分用[^.]*表示,即匹配 . 之外的符号
方法二
尾部加re.S,这种情况 . 将匹配包括换行符在内的符号,所以将h1和a标签之间的部分用.*表示
example1 = re.compile(r'<h1>[^.]*<a href="/" style="(.*?)">Quotes to Scrape</a>')
example2 = re.compile(r'<h1>.*<a href="/" style="(.*?)">Quotes to Scrape</a>',re.S)
print(example1.findall(r.text))
print(example2.findall(r.text))
结果

结论
以后用正则还是只匹配单行吧,如果不得不涉及多行的话,感觉还不如beautifulsoup或者css、xpath来的方便,或者先用上述工具筛选出标签页,再用正则进行匹配。
参考文献
[1]:http://blog.sina.com.cn/s/blog_47cccb0201000b4x.html
如何用正则表达式匹配多行 slummer
[2]:https://blog.csdn.net/qq_39241986/article/details/100036180
正则表达式匹配多行的三个方法(Python)简说Python
本文探讨了使用正则表达式匹配多行文本的两种有效方法,一是通过[^.]*排除换行符,二是利用re.S使.匹配包括换行符在内的所有字符。并对比了正则与BeautifulSoup、CSS、XPath在复杂网页解析中的适用性。
1777

被折叠的 条评论
为什么被折叠?



