Python爬虫教程之利用正则表达式匹配网页内容


Posted in Python onDecember 08, 2020

前言

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

Python爬虫教程之利用正则表达式匹配网页内容

首先鼠标右键查看网页源代码

Python爬虫教程之利用正则表达式匹配网页内容

如我们需要爬取电影的名称,我们搜索‘

82年生的金智英'

Python爬虫教程之利用正则表达式匹配网页内容

正则表达式的思路是通过需要爬去的字段旁边的字符去夹住想要的字符串,如我们需要‘82年生金智英'这穿字符,我们可以用“13px;">”和“<”去夹住它。

Python爬虫教程之利用正则表达式匹配网页内容

搜索该结构可以发现,只有标题会用到该结构,不会误爬到其他无关字符串。下面上爬虫代码

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爬虫用正则表达式匹配网页内容内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现爬虫下载美女图片
Jul 14 Python
Python实现二叉搜索树
Feb 03 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
Python的Tkinter点击按钮触发事件的例子
Jul 19 Python
Python交互式图形编程的实现
Jul 25 Python
python自动化工具之pywinauto实例详解
Aug 26 Python
Python流程控制 while循环实现解析
Sep 02 Python
python绘制随机网络图形示例
Nov 21 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
May 15 Python
pytorch 使用半精度模型部署的操作
May 24 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 Python
python基础之类方法和静态方法
Oct 24 Python
Python创建文件夹与文件的快捷方法
Dec 08 #Python
Python之字符串的遍历的4种方式
Dec 08 #Python
利用python爬取有道词典的方法
Dec 08 #Python
Python控制鼠标键盘代码实例
Dec 08 #Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 #Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 #Python
Python爬虫之App爬虫视频下载的实现
Dec 08 #Python
You might like
解析PHP汉字转换拼音的类
2013/06/18 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
PHP制作万年历
2015/01/07 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
纯CSS打造的导航菜单(附jquery版)
2010/08/07 Javascript
基于jquery的滑动样例代码
2010/11/20 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
JS实现简易图片自动轮播
2020/10/16 Javascript
探究Python中isalnum()方法的使用
2015/05/18 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
分分钟入门python语言
2018/03/20 Python
python实现最长公共子序列
2018/05/22 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
大专生的学习自我评价
2013/12/04 职场文书
单身联谊活动方案
2014/01/29 职场文书
入党积极分子学习党的纲领思想汇报
2014/09/13 职场文书
小学教师岗位职责
2015/04/02 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
7个关于Python的经典基础案例
2021/11/07 Python
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
2022/08/14 Servers