Python爬虫之使用正则表达式匹配网页内容
Python爬虫,除了使用大家广为使用的scrapy架构外,还有很多包能够实现一些简单的爬虫,如BeautifulSoup、Urllib、requests,在使用这些包时,有的网络因为比较复杂,比较难以找到自己想要的代码,在这个时候,如果能够使用正则表达式,将能很方便地爬取到自己想要的数据。
何为正则表达式
正则表达式是一种描述字符串排列的一种语法规则,通过该规则可以在一个大字符串中匹配出满足规则的子字符串。简单来说,就是给定了一个字符串,在字符串中找到想要的字符串,如一个电话号码,一个IP地址,一个字段,在爬虫过程中,如果灵活使用正则表达式,将极大地提升爬虫效率。
正则表达式 | 描述 |
---|---|
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0个或多个的表达式。 |
re+ | 匹配1个或多个的表达式。 |
re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
re{ n} | |
re{ n,} | 精确匹配n个前面表达式。 |
re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a | b |
(re) | G匹配括号内的表达式,也表示一个组 |
(?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
(?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
(?: re) | 类似 (…), 但是不表示一个组 |
(?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
(?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
(?#…) | 注释. |
(?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
(?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
(?> re) | 匹配的独立模式,省去回溯。 |
\w | 匹配字母数字 |
\W | 匹配非字母数字 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9]. |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。 |
\B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 |
\n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
\1…\9 | 匹配第n个分组的子表达式。 |
\10 | 匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。 |
Python使用正则表达式
re.match
import re
str1='123asdfa'
mathch1 = re.match("^[0-9]",str1)
print(mathch1.group())
结果
1
如果要匹配12,则
import re
str1='12s3asdfa'
mathch1 = re.findall("1[0-9]",str1)
print(mathch1)
结果
['12']
修改[0-9]为[10-19]是无法匹配到的。
因此,该语句将从头到尾匹配字符,匹配到则结束,需要.group才能获取到匹配到的值。
re.search
import re
str1='1a2s3asdfa'
mathch1 = re.search("^[0-9]",str1)
print(mathch1.group())
结果
1
从头到尾匹配字符,直到找到一个匹配,需要.group才能获取到匹配到的值。re.serach()和re.match()的区别,re.search()将匹配所有的字符,re.match只匹配字符串的开头,如果开头不符合规则,则返回None。
re.split()
import re
str1='1a2s3asdfa'
mathch1 = re.split("[0-9]",str1)
print(mathch1)
结果
['', 'a', 's', 'asdfa']
将匹配到的字符作为分隔符分隔字符串。
re.findall()
import re
str1='12s3asdfa'
mathch1 = re.findall("[0-9]",str1)
print(mathch1)
运行结果
['1', '2', '3']
匹配所有符合规则的字符。
re.sub(pattern, repl, string, count,flag)
import re
str1='12s3asdfa'
mathch1 = re.sub("[0-9]",'|',str1)
print(mathch1)
结果
||s|asdfa
用后面的字符替换前面的符合规则的字符。
爬虫实例
如需要爬取豆瓣热门电影2019,网址为:https://movie.douban.com/chart
首先鼠标右键查看网页源代码
如我们需要爬取电影的名称,我们搜索‘
82年生的金智英’
正则表达式的思路是通过需要爬去的字段旁边的字符去夹住想要的字符串,如我们需要‘82年生金智英’这穿字符,我们可以用“13px;">”和“<”去夹住它。
搜索该结构可以发现,只有标题会用到该结构,不会误爬到其他无关字符串。下面上爬虫代码
import re
import requests
url='https://movie.douban.com/chart'
header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
result= requests.get(url,headers=header)
data=re.findall(r'13px\;\"\>([^\<]+)',result.text)
print(data)
结果是一个长度为9的数组。
['82年生金智英 / Kim Ji-young,Born 1982', '爱尔兰杀手(港) / 听说你刷房子了', '小丑起源电影:罗密欧 / Romeo', '情迷纽约下雨天(港) / 纽约有雨', '从前, 有个荷里活(港) / 从前,有个好莱坞...(台)', '长安盗', '地下6号 / 六尺之下', '丧尸乐园:连环尸杀(港) / 尸乐园:脏比双拼(台)', '浴火的少女画像(港) / 燃 烧女子的画像(台)']
该爬虫需要用到headers,不然会拒绝连接。
data=re.findall(r’13px\;\"\>
([^\<
]+)’,result.text)
表示在result.text这个长字符串中查找,获取“13px;">”和“<”之间的字符串," \ "代表转移字符,否则无法识别这些符号。
这个案例可能不是最好的使用正则表达式的例子,但是想要给大家分享的是,以后如果遇到很复杂的网络结构,与其一层一层解析,不妨换一种思路,使用正则表达式说不定能够“柳暗花明又一村”。
如有错误,欢迎指出~
Python爬虫之使用正则表达式匹配网页内容相关推荐
- Python爬虫学习 7 —— 正则表达式
当我们从HTML text中提取信息时,可以发现很多信息都是有规律的,比如我们要获得网页链接url.提取网页中的IP.查询具有某种规律的字符串.正则表达式就是用于匹配具有某种规律的字符串而产生的, ...
- Python爬虫(八)_正则表达式
什么是正则表达式 正则表达式,又称规则表达式,通常被用来检索.替换那些符合某个模式(规则)的文本. 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一 ...
- Python中使用中文正则表达式匹配指定的中文字符串
业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发 ...
- python爬虫正则表达式实例-3.Python爬虫入门_正则表达式(简单例子)
1 #2019-11-23 2 importrequests3 importtime4 import re #Python正则表达式库 5 6 if __name__=='__main__':7 #海 ...
- 利用python爬虫(part6)--用Xpath匹配带来的数据合并问题
学习笔记 如果在本Blog里看到拼音,那可能是由于第一次shen he没通过被逼的,葛优躺,不知所措. 用Xpath匹配带来的数据合并问题 在我以往的爬虫案例中(比如:X凰X闻案例),我用Xpath分 ...
- Python爬虫入门七正则表达式
已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式 1.了解正则表达式 正则表达式是用来匹配字符串非常强大的工 ...
- Python爬虫四(正则表达式)
菜鸟教程 之 python 正则表达式:http://www.runoob.com/python/python-reg-expressions.html python 官网正则文档:https://d ...
- 模拟登陆CSDN -- Python爬虫练习之正则表达式和cookie
这周学习的主题是正则表达式和cookie,原本是计划每天晚上11点下班到家,练上一两个钟就把这部分过了,结果这周各种事情和不再状态,所以没整完,直至今天才把相关问题过掉.其实这部分也挺不错的,也并没有 ...
- Python基础教程:正则表达式-匹配多个字符
匹配多个字符的相关格式 字符 功能 * 匹配前一个字符出现0次或者无限次,即可有可无 + 匹配前一个字符出现1次或者无限次,即至少有1次 ? 匹配前一个字符出现1次或者0次,即要么有1次,要么没有 { ...
- 【Python爬虫】Re(正则表达式)库入门
正则表达式的概念 正则表达式的语法 Re库的基本使用 练习: >>> import re >>> match=re.search(r'[1-9]\d{5}','BI ...
最新文章
- java 方法查询_java 几种查询方式【转】
- ThinkPHP判断更新是否成功的正确方法
- (转)linux基本变量学习:位置变量$0 、$1 shift轮替、本地变量、环境变量、特殊变量...
- 为什么大家都在吹捧Python?
- jaccard相似度_如何计算两个字符串之间的文本相似度?
- python设置黑色主题_Python背景色与语法高亮主题配置
- mysql 备份数据
- python导入模块报错“ImportError: No module namedXXX”
- java转俯视图_Tweening / Animating threejs相机到顶视图
- 64位oracle plsql developer 下载地址,plsql developer
- unity播放视频代码
- IJCAI2022论文合集(持续更新中)
- 网课搜题API接口搭建教程
- oracle index alter,Oracle alter index rebuild 一系列问题
- zookeeper集群,HA,单点故障
- H264学习笔记(1):视频压缩编码的基本原理
- 工单状态TECO/DLV
- java sql 工资管理,企业工资管理系统(Java+MySQL)Word版
- 郭台铭为什么如此有魄力?
- office ppt放映时,视频无法播放