Python 爬虫正则表达式和re库,及re库的基本使用,提取单页面信息
正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索、替换、匹配验证都不在话下,正则表达式在所有编程里通用,所以不仅仅是python使用。
以下是常用的正则表达式,用的时候参考即可,不需要死记硬背,用得多了自然就熟悉了。
- d :匹配任意数字,等价于 [0-9]
- D :匹配任意非数字的字符,d的取反
- w:代表字母,数字,下划线。也就是 a-z、A-Z、0-9、_。
- W:代表不是字母,不是数字,不是下划线的。w的取反
- n:代表一个换行
- r :代表一个回车
- f :代表换页
- t :代表一个 Tab
- s:代表所有的空白字符,也就是上面这个:n、r、t、f
- S:代表所有不是空白的字符,s的取反
- A :代表字符串的开始
- Z:代表字符串的结束
- ^ :匹配字符串开始的位置
- $ :匹配字符串结束的位置
- . :代表所有的单个字符,除了 n r
- […] :代表在 [] 范围内的字符,比如 [a-z] 就代表 a到z的字母
- [^…] :代表不在 [] 范围内的字符 ,[…] 的取反
- {n} :匹配在 {n} 前面的东西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的两个o
- {n,m} :匹配在 {n,m} 前面的东西,比如:o{1,3} 将匹配“fooooood”中的前三个o
- {n,} :匹配在 {n,} 前面的东西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o
- * :和 {0,} 一个样,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”
- + :和{1,} 一个样,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”
- ? :和{0,1} 一个样,匹配 ?前面 0 次或 1 次
- a|b :匹配 a 或者 b
- ():匹配括号里面的内容
1、python爬虫最常用组合
死记硬背,估计很难记住,很多人就不想学了。但是只要记住最常用的组合即可。
.*? 是我们在匹配过程中最常使用到的,表示的就是匹配任意字符。
\\d+ 匹配任意数字组合。
上面的 .*? 为什么不直接用 .* 而需要加个 ?,这个涉及到贪婪还是非贪婪匹配。
2、贪婪还是非贪婪匹配
贪婪匹配:就是我们的第一段代码,一个数一个数都要去匹配,会尽可能多地去匹配内容。
非贪婪匹配:会尽量少的匹配符合条件的内容 也就是说,一旦发现匹配符合要求,立马就匹配成功,而不会继续匹配下去。
例子:
Python语言中的re模块拥有全部的正则表达式功能。
1、re.match函数
函数语法:
匹配成功re.match方法返回一个匹配的对象,否则返回None。
示例:
执行结果:
从例子中我们可以看出,re.match()方法返回一个匹配的对象,而不是匹配的内容。
通过调用span()可以获得匹配结果的位置。
而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None。
2、分组捕获
以上可以看到返回的是匹配的对象,不是匹配的内容。
需要获取匹配的内容,我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
一般一个小括号括起来就是一个捕获组。我们可以使用group()来提取每组匹配到的字符串。
- group(num=0): 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
- groups(): 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
示例:
执行结果:
以上成功通过group捕获需要的词组和内容。
3、re.search()函数
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
示例:
执行结果:
以上,如果用re.match则无法匹配,因为正则表达式不符合字符串规范,会报错。
而用re.search,直接匹配整个字符串。找到第一个符合 \\d+ 的字符串100。
注:仅仅是匹配第一个符合的,所以只有100,后面的200不会匹配。
4、re.findall()函数
re.search可以直接匹配找到符合正则的字符串,但是仅仅是**第一个**符合的。
如果需要匹配全部的符合的,则用到re.findall()函数。
re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。
示例:
执行结果:
由于返回的是返回一个列表或元组,所以也不需要group来捕获。如果需要一个一个捕获,用res[0] 或res[1]来一个一个显示捕获的值。
5:re.sub()函数
检索和替换,Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。
语法:
示例:
执行结果:
6:re.compile()函数
这个主要就是把我们的匹配符封装一下,这个也是很常用的一个函数。
表达式:
参数:
pattern : 一个字符串形式的正则表达式
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- re.I 忽略大小写
- re.L 表示特殊字符集 \\w, \\W, \\b, \\B, \\s, \\S 依赖于当前环境
- re.M 多行模式
- re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
- re.U 表示特殊字符集 \\w, \\W, \\b, \\B, \\d, \\D, \\s, \\S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和 # 后面的注释
示例:
以上,我们可以先用re.compile把正则表达式封装,便于以后反复使用。封装后如下:
执行结果相同:
7、其他函数
re.finditer,和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
输出结果:
re.split,split 方法按照能够匹配的子串将字符串分割后返回列表。
示例:
执行结果
其他函数,具体用法可参考官方文档:https://docs.python.org/zh-cn/3/library/re.html
1、正则表达式分析
惯例,同样以豆瓣电影排行做分析,链接为:https://movie.douban.com/top250
查看源代码,简单点,我们提取4个信息即可。分别是排名序号、电影名称、导演演员、年份类型。
分析,所有信息在li标签中,所以首尾用在 li 标签中找就行了。需要的提取的信息,用()分组捕获就行。
1:第一个信息,排名序号,排名序号1在class></em之间。em是唯一的,比较简单。
2:第二个信息,电影名称,有很多地方,但是我们选个唯一明显不重复的,alt= 后面是标签里唯一的,整个标签里面就一个信息,所以这里比较简单,这时正则表达式为。
3:第三个信息,导演演员,在<p 标签里面,br>标签上方,这时正则表达式为。
4:第四个信息,年份类型,同理br>标签后方,</p结束,这个也很明显,最后的正则表达式为。
2、页面信息提取
正则表达式完成后,基本完成一大半了。现在简单提取相关信息。
这里用到两个库,re库正则表达式,和requests库抓取页面
执行结果,返回一个列表,还有\\n空格等,比较乱,类似如下:
3、列表去\\n空格
为了整洁,我们先抓取列表第一个数据 即 items[0] ,并去掉\\n和空格。
列表去除\\n,需要用到 strip() 函数, strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。但是该函数只支持字符串,不支持列表。所以需要用循环的方式。如下:
最后更改后的代码为:
执行结果这时候整洁多了:
4、循环提前整个页面信息
以上只有第一个信息,整个页面有很多信息,需要全部提取,并排列整齐,所以需要再次用到for循环,一列一列的显示出来。
最终代码为:
执行结果:
到这里,单个页面的信息就已经提取完成了,也算是完成了爬虫的一小步了。
jmeter(十五)-正则表达式提取器
sampler请求的服务器响应结果中通过正则表达式提取值所需值,生成模板字符串,并将结果存储到给定的变量名中。
界面如下:
正则表达式提取器界面
- Apply to:作用范围(返回内容的断言范围)
1)Main sample and sub-samples:作用于主节点的取样器及对应子节点的取样器
2)Main sample only:仅作用于主节点的取样器
3)Sub-samples only:仅作用于子节点的取样器
4)JMeter Variable:作用于jmeter变量(输入框内可输入jmeter的变量名称),从指定变量值中提取需要的值。
- Field to check:要检查的响应报文的范围
1)主体:响应报文的主体,最常用
2)Body(unescaped):主体,是替换了所有的html转义符的响应主体内容,注意html转义符处理时不考虑上下文,因此可能有不正确的转换,不建议使用
3)Body as a Document:从不同类型的文件中提取文本,注意这个选项比较影响性能
4)Response Headers(信息头):响应信息头(
5)Request Headers:请求信息头
6)URL:请求url
7)Response Code(响应代码):响应状态码,比如200、404等
8)Response Message(响应信息):响应信息
- 引用名称(Names of created variables):
Jmeter变量的名称,存储提取的结果;即下个请求需要引用方法是${变量名}。
- 正则表达式(Regular Expression):
使用正则表达式解析响应结果,()括号表示提取字符串中的部分值,前后是提取的边界内容。
常用正则表达式:(.*?)表示匹配任意长度的任意字符,是最常用的正则表达式,基本能满足80%场景要求
- 模板(Template):
正则表达式的提取模式。如果正则表达式有多个提取结果,则结果是数组形式,模板$1$,$2$等等,表示把解析到的第几个值赋给变量;从1开始匹配,以此类推。
若只有一个结果,则只能是$1$;有多个结果,可以使用$1$2$方式取2个值。
- 匹配数字(Match No.(0 for Random)):
正则表达式匹配数据的结果可以看作一个数组,表示如何取值:
1)0代表随机取值,默认
2)正数n表示取第n个值,(1:第一个值 )
3)负数表示提取所有符合条件的值,(-1:所有)
- 缺省值(Default Value):
匹配不到值的时,取该值;
- 使用空默认值(Use empty default value):
勾选后,提取不到值时,则返回空字符串。
1)主体(body)
2)Response Headers(信息头)
3)Request Headers:请求信息头
4)URL
5)Response Code(响应代码)和Response Message(响应信息)
正则表达式提取器如下:
测试结果:
调试取样器
使用变量,也可以通过变量名_g直接进行提取,如下:
正则表达式提取器
测试结果:
正式表达式:
备注:多个模板( $1$2$ )的时候,可以用空格、, 、. 、 – 连接模板
测试结果:
备注:在调试过程中可结果察看结果树和Debug sample来帮助分析结果。
超级厉害的提取函数——REGEXP正则函数(关于汉字部分)
在日常工作中,我们经常会遇到提取文本或者数字等,今天为大家介绍一个新函数—REGEXP正则函数,它的功能很强大,在提取时不需要嵌套其它函数,非常方便。
如图,我们需要根据要求,提取跟文字相关的信息,主要用到的正则表达式为:
[一-龟] 常用的汉字字符集
[一-龥] 所有汉字字符集
[一-龟]+ 任意汉字组成的一段连续字符集
[一-龟].+ 以汉字开头的所有字符集
[^一-龟] 非中文字符集
+ 表示出现一次或多次
- 提取第一个汉字前的内容
如图,我们需要提取第一个汉字前的内筒,在单元格中输入公式:=REGEXP(A2,\”^[^一-龟]+\”),公式中的第一个^,表示从字符串的开头提取;方括号中的^表示排除,[^一-龟]代表非中文字符,[^一-龟]+表示至少1个字符长的非中文字符。
2.提取除汉字外的部分
我们在单元格中输入公式:=REGEXP(A2,\”[^一-龟]+\”),这里的[^一-龟]+,表示所有的非中文字符,最后回车后得到提取结果。
3、提取第一个汉字起的内容
我们需要提取第一个汉字起的所有内容,在单元格中输入公式:=REGEXP(A2,\”[一-龟].+\”),[一-龟].+表示以汉字开头的字符集。
4、提取所有的文字内容
我们在单元格中输入公式:=REGEXP(A2,\”[一-龟]\”),或者=REGEXP(A2,\”[一-龥]\”)即可,[一-龥]+表示所有汉字。当我们不需要提取生僻字时,可以使用“[一-龟]+”,公式输入会更方便。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。