WebScraper⾼级⽤法——利⽤正则表达式筛选⽂本信息简易数
据分析17
这是简易数据分析系列的第 17 篇⽂章。
学习了这么多课,我想⼤家已经发现了,web scraper 主要是⽤来爬取⽂本信息的。
在爬取的过程中,我们经常会遇到⼀个问题:⽹页上的数据⽐较脏,我们只需要⾥⾯的⼀部分信息。⽐如说要抓取电影的评价⼈数,⽹页中抓到的原始数据是1926853⼈评价,但是我们期望只抓取数字,把⼈评价这三个汉字丢掉。
这种类似的操作在 Excel 可以利⽤公式等⼯具处理,其实在 web scraper ⾥,也有⼀个利器,那就是正则表达式。
正则表达式是⼀个⾮常强⼤⼯具,它主要是⽤来处理⽂本数据的,常⽤来匹配、提取和替换⽂本,在计算机程序中有⾮常⼴泛的应⽤。web scraper 中也内置了正则表达式⼯具,但只提供了提取的功能。虽然功能有所残缺,对于 web scraper 使⽤者来说完全够⽤了,毕竟web scraper 的定位就是不会写代码的⼩⽩,我们只需要学习最基础的知识就可以了。
1.正则表达式初尝
我们先⽤ web scraper 初步尝试⼀下正则表达式。这⾥还是⽤⾖瓣电影做例⼦,我们先选择电影的评价⼈数,预览图是这个样⼦的:
Text 选择器有个Regex的输⼊框,这个就是输⼊正则表达式的地⽅。我们输⼊[0-9],然后再点击预览,是这个样⼦的:
这时候你应该就明⽩了,[0-9]就是匹配⼀个数字的意思。如果我们要匹配多个数字呢?很简单,后⾯再加个「+」号就好。把[0-9]+输⼊进去,预览⼀下:
很明显,所有的数字都匹配出来了。
2.正则表达式字符簇
上⾯讲了⽤[0-9]匹配数字,我们想⼀下⽇常⽤到的⽂本信息,不外乎这⼏种:数字、⼩写字母、⼤些字母,汉字,特殊字符(⽐如说各种计量单位、下划线回车等符号)。
正则表达式⾥都有匹配这些字符的⽅法,下⾯我⽤⼀个表格列举出来:
字符簇匹配
[0-9]匹配所有的数字
[1-9]匹配 1 到 9
[a-z]匹配所有的⼩写字母
[A-Z]匹配所有的⼤写字母
sky匹配sky这个单词,其余⽂本同理
天空匹配天空这个词,其余⽂本同理
[\u4e00-\u9fa5]匹配所有的汉字(绝⼤部分情况下可以匹配成功)
[ \f\r\t\n]匹配所有的空⽩字符
上⾯列举了⼀些常⽤的,其实这些规则可以组合起来,⽐如说[a-z]和[A-Z]组合起来,就是[a-zA-Z],表⽰匹配所有的字母。这些组合也有⼀些简写,我这⾥也列举⼀些:
字符簇匹配
\w匹配字母、数字、下划线。等价于[A-Za-z0-9_]
\W匹配⾮字母、数字、下划线
\s匹配任何空⽩字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]
\S匹配任何⾮空⽩字符
字符簇匹配
基本上掌握以上内容就能匹配绝⼤多数字符了,这⾥我推荐⼀个正则练习⽹站:
按照下图所⽰就可以练习正则匹配了:
结合前⾯的例⼦,我们知道这些规则只能匹配⼀个字符,如何匹配多个字符?这就要学习正则表达式限定符。
3.正则表达式限定符
我们已经知道在 [0-9] 后⾯加个加号「+」就可以匹配多个字符了,其实还有很多限定符,详情可见下图表格:
限定
匹配解释原始数据例⼦
{n}n 是⼀个⾮负整数。匹配确定的 n 次10000110{2},表⽰ 0 这个字符匹配 2 次,匹配结果是 100
{n,m}m 和 n 均为⾮负整数,其中n <= m。最少匹配 n 次且最
多匹配 m 次
10000110{2,3}
scraper
,表⽰ 0 这个字符最少匹配 2 次且最多匹配 3 次,匹
配结果是 1000
{n,}n 是⼀个⾮负整数。⾄少匹配 n 次10000110{2,},表⽰ 0 这个字符⾄少匹配 2 次,匹配结果是 10000 +匹配前⾯的⼦表达式⼀次或多次,等价于{1,}z,zo,zoo zo+能匹配「zo」以及「zoo」,但不能匹配「z」
*匹配前⾯的⼦表达式零次或多次,等价于{0,}z,zo,zoo zo*能匹配「z」、「zo」以及「zoo」匹配前⾯的⼦表达式零次或⼀次,等价于{0,1}z,zo,zoo zo?能匹配「z」以及「zo」,但不能匹配「zoo」
4.实战练习
学到这⾥,正则表达式可以算是⼊门了,我们可以上⼿⼏个真实的例⼦练习⼀下:
1.提取价格标签中的数字
假设 web scraper 爬到的⽂本信息是价格:12.34 ¥,我们要把12.34提取出来。这个这个⽂本⾥有 5 类数据:
汉字:价格
标点符号::
数字12和34
⼩数点:.
特殊字符:¥
⾸先我们匹配⼩数点前的数字12,因为价格什么数字可以能出现,⽽且位数⼀般都⼤于 1 位,所以我们⽤[0-9]+来匹配;考虑到⼩数点「.」在正则表达式⾥有特殊含义,我们需要⼩数点前⾯加反斜杠\表
⽰转义,⽤\.匹配;⼩数部分同理,也⽤[0-9]+匹配。
把这三部分组合在⼀起,即「[0-9]+\.[0-9]+」,这个表达式可以⽤⼀个图来表⽰:
上⾯就是我们写出的匹配正则,可以放在刚刚推荐的⽹站上验证⼀下:
2.匹配⽇期
假设 web scraper 爬到的⽂本信息是⽇期:2020-02-02[星期⽇],我们要把2020-02-02[星期⽇]提取出来。我们把这个⽂本分解⼀下:
描述信息⽇期:不匹配,需要丢弃掉
年,⼀般是 4 位,可以⽤[0-9]{4}匹配
⽉,⼀般是 2 位,可以⽤[0-9]{2}匹配
⽇,⼀般是 2 位,可以⽤[0-9]{2}匹配
星期,多个汉字,可以⽤[\u4e00-\u9fa5]+匹配
分隔符-,可以直接⽤「-」匹配
分隔符[和],为了避免和正则表达式⾥的[]撞车,我们可以在前⾯加反斜杠\表⽰转义,⽤\[ 和\]匹配
把上⾯的分析结果综合⼀下,就是
[0-9]{4}-[0-9]{2}-[0-9]{2}\[[\u4e00-\u9fa5]+\]
看上去还是挺复杂的,但是如果按上⾯的分析步骤⼀步⼀步来,你会发现匹配规则其实还是⽐较清晰的。
同样我们可以⽤⼀张图来表⽰上⾯的正则表达式:
5.进阶学习
本篇教程只是正则的⼊门学习,很多知识点还没有讲到。如果你对此感兴趣,可以去下⾯⼏个⽹站学习:
1.
继续深⼊学习的⼀个⽹站,不过想成为⾼⼿,还得多加练习
2.
可以测试⾃⼰写的正则是否正确的⼀个⽹站,⽽且⽹页末有常⽤的正则表达式,很多可以直接复制黏贴来⽤。
3. 和
可以可视化的显⽰⾃⼰的正则匹配规则,教程中我就⽤了 regulex ⽣成正则匹配规则图。
6.温馨提⽰(踩坑预警)
我看了 web scraper 的源代码,它的正则表达式⽀持不完全,⽬前只⽀持提取⽂字的功能:
他⽋缺的功能有:
全局匹配不⽀持
忽略⼤⼩写不⽀持
不⽀持分组提取,默认返回第⼀个匹配值
不⽀持⽂本替换
如果有以上的需求,可能要借助 Excel 等⼯具来⽀持。
7.联系我
因为⽂章发在各⼤平台上,账号较多不能及时回复评论和私信,有问题可关注 ——「卤蛋实验室」,(或 wx 搜索 egglabs)关注上车防失联。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。