11《Python 原生爬虫教程》使用正则表达式进行页面提取

上节课我们学习了如何使用 BeautifulSoup 来解析页面,这节课我们来学习下如何使用正则来解析页面。

  • 正则表达式的基本概念
  • 正则表达式基本语法
  • 正则表达式常用函数

通过学习正则表达式几个常用函数,可以根据需要对数据进行匹配筛选。

1. 正则表达式简介

在编写爬虫的过程中,我们需要解析网页的内容。那么作为文本解析利器的正则表达式当然可以运用到我们的爬虫开发中。其实页面解析过程无非是从海量的字符串中将我们所需要的数据匹配并剥离出来,所以在正式的爬虫开发中正则会经常被用到。

正则表达式是对字符串操作的逻辑公式。在提取网页的数据的时候,我们需要把源代码转换成字符串,然后通过正则表达式匹配想要的数据。

在我们开始使用正则表达式进行模式查找之前,我们需要先熟悉一下正则表达式里面的字符的基本含义,熟悉了它们之后,我们就可以很方便的书写一些正则表达式进行模式匹配了。

2. 正则表达式基本语法

正则表达式的字符和含义

模式 描述
. 匹配任意字符, 除了换行符
* 匹配前一个字符0次或者多次
+ 匹配前一个字符1次或者多次
匹配前一个字符0次或者1次
^ 匹配字符串开头
$ 匹配字符串结尾
() 匹配括号内的表达式,表示一个组
\s 匹配空白字符
\S 匹配任何空白字符
\d 匹配数字,等于[0-9]
\D 匹配非数字,等于[^0-9]
\w 匹配字符数字,等于[A-Za-z0-9]
\W 匹配非字符数字,等于[^A-Za-z0-9]
[] 表示一组字符

3. 正则表达式的常用方法

我们开发爬虫使用的是 Python 语言,那么在 Python 中如何使用正则表达式呢?在 Python 中已经内置了正则表达式模块 rere 库是内置在 Python 中的,不需要我们进行安装,直接导入使用即可。

这里我们主要详细讲解一下 re 库中的几种常用方法。这几种方法也是会经常用在爬虫开发中的,只要掌握了这些种方法,基本上在爬虫开发中需要使用正则表达式的问题都可以解决。

3.1 re.findall

findall 方法是找到所有的符合规则的匹配内容,具体语法如下:

re.findall(pattern, string, flags=0)

来看个例子,找出所有的字符串中的数字:

import re # 导入正则

example = 'abc 33 bbb 3223 yehgst adsfe3 332' # 创建目标字符串
pattern = '\d+'
re.findall(pattern, example) 


效果如下图所示:

5e7cc68509c29fd405700452.jpg

3.2 re.search

re.search 扫描整个字符串,并返回第一个成功的匹配。具体语法如下:

re.search(pattern, string, flags=0)

来看个例子:

import re

example = "Python is the best language!"

re.search('\APython', example)
re.search('\AJava', example)


效果如下图所示:

5e7cc68509c29fd405700452.jpg

3.3 re.match

如果 string 开始的 0 或者多个字符匹配到了正则表达式样式,就返回一个相应的匹配对象 。 如果没有匹配,就返回 None ;注意它跟零长度匹配是不同的。

re.match(pattern, string, flags=0)

实例:

import re

string = '5523 abc, cde 666623'

pattern = '(\d{4}) (\w{3})'

match = re.search(pattern, string) 

match.group(1)
match.group(2)
match.groups()


效果如下:

5e7cc69b09e754cc05700452.jpg

3.4 re.split

用 pattern 分开 string 。 如果在 pattern 中捕获到括号,那么所有的组里的文字也会包含在列表里。如果 maxsplit 非零, 最多进行 maxsplit 次分隔, 剩下的字符全部返回到列表的最后一个元素

re.split(pattern, string)

实例:

import re

string = 'aaabbb 212 dxsxasxw fdexx:3453423.'
pattern = '\d+'

result = re.split(pattern, string) 
print(result)


效果如下:

5e7cc6a509bbf96905700452.jpg

3.5 re.sub

返回通过使用 repl 替换在 string 最左边非重叠出现的 pattern 而获得的字符串。 如果样式没有找到,则不加改变地返回 string。 repl 可以是字符串或函数;如为字符串,则其中任何反斜杠转义序列都会被处理。 也就是说,\n 会被转换为一个换行符,\r 会被转换为一个回车附,依此类推。 未知的 ASCII 字符转义序列保留在未来使用,会被当作错误来处理。 其他未知转义序列例如 & 会保持原样。 向后引用像是 \6 会用样式中第 6 组所匹配到的子字符串来替换

re.sub(pattern, replace, string)

实例:

import re

string = 'abc 3d a52a33 adex f45 6'

pattern = '\s+'

replace = ''

new_string = re.sub(pattern, replace, string) 
print(new_string)


例子如下:

5e7cc6af09b702be05700452.jpg

3.6 re.subn

行为与 sub() 相同,但是返回一个元组 (字符串, 替换次数).

re.subn(pattern, replace, string)

实例:

import re

string = 'abc 3d a52a33 adex f45 6'

pattern = '\s+'

replace = ''

new_string = re.subn(pattern, replace, string) 
print(new_string)


例子如下:

5e7cc6b70912b57305700452.jpg

4. 小结

这一小节,我们学习了正则表达式的基本语法,以及通过多个例子展示了正则表达式的使用方法,正则表达式难有一点大, 同学们需要多加练习,才能牢固的掌握。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容