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实现颜色rgb和hex相互转换的函数
Mar 19 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
python django事务transaction源码分析详解
Mar 17 Python
Python输出各行命令详解
Feb 01 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
Dec 21 Python
Python模拟百度自动输入搜索功能的实例
Feb 14 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
python修改微信和支付宝步数的示例代码
Oct 12 Python
Django自带的用户验证系统实现
Dec 18 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&amp;&amp;mysql)三
2006/10/09 PHP
PHP程序员编程注意事项
2008/04/10 PHP
PHP 字符串 小常识
2009/06/05 PHP
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
Jquery 在页面加载后执行的几种方式
2014/03/14 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
简单快速的实现js计算器功能
2017/08/17 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
Antd表格滚动 宽度自适应 不换行的实例
2020/10/27 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
python获取android设备的GPS信息脚本分享
2015/03/06 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python中import机制详解
2017/11/14 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python计算不规则图形面积算法实现解析
2019/11/22 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
学校司机岗位职责
2013/11/14 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技