• 0 网页爬取准备
  • 1 正则表达式基础
    • 1.1 正则表达式模式及修饰符(flags)
      • 1.1.1 正则表达式模式
      • 1.1.2 正则表达式修饰符
    • 1.2 正则表达式匹配方法
      • 1.2.1 re.match()函数【单个】
      • 1.2.2 re.search()函数【单个】
      • 1.2.3 re.findall()函数【所有】
      • 1.2.4 re.finditer()函数【所有】
      • 1.2.5 re.split()分割匹配的字符串
      • 1.2.6 re.sub()函数检索和替换
  • 2 常用正则表达式
    • 2.1 贪婪模式
    • 2.2 中文信息
    • 2.3 匹配空白行
    • 2.4 匹配网址

0 网页爬取准备

# 只需 shift+回车 运行本单元格,就可以让jupyter notebook宽屏显示
from IPython.core.display import display, HTML
display(HTML('<style>.container { width:100% !important; }</style>'))

先用一个简单的爬虫获取数据然后利用正则表达式的提取有用的信息。

import requests
# 设置一个输入的值,加载至url中
keyword = input("请输入你要查询的关键字:")
headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Mobile Safari/537.36"
}
# 携带请求参数的url,如果想要爬取不同关键字对应的页面,
# 我们需要将url携带的参数进行动态化
# 实现参数动态化
params = {"query":keyword
}
url =" https://www.sogou.com/sogou"
# params参数是一个字典采纳数,保存url时携带参数
response = requests.get(url=url,params=params,headers=headers)
# encoding返回的是响应数据的原始的编码格式,
# 如果给其赋值则表示修改了响应数据的编码格式
response.encoding = "urf-8"
# 3. 获取响应数据
# .text:返回的是字符串形式的响应数据
result = response.text
请输入你要查询的关键字周志华
# 查看获取网页数据信息
# result

1 正则表达式基础

1.1 正则表达式模式及修饰符(flags)

1.1.1 正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式。正则表达式模式中的字符串的作用就是用来匹配到更长字符串的同样的字符串。由于正则表达式中可能会出现转义字符("\"),因此我们需要在前面加一个(“r”),或者将("\")变为("\ \")。

  • 正则表达式中常用的特殊模式字符参考
  • 正则表达式中详细的特殊模式字符参考

1.1.2 正则表达式修饰符

目的:flags用于控制匹配的模式,单个标志如用re.S,多个标志在中间加"|"即可,如re.S|re.U。正则表达式修饰符即功能说明见下表:

修饰符 功能说明
re.S 使.匹配包括在内的所有字符,即能够实现换行提取
re.M 多行匹配,但是影响^和$
re.I 匹配时对大小写不敏感
re.L 做本地化识别匹配
re.x 该标志通过给予你更加灵活的格式以便于你将正则表达式写得更易于理解
re.U 根据Unicode字符集解析字符,影响\w,\W,\b,\B

1.2 正则表达式匹配方法

1.2.1 re.match()函数【单个】

re.match(pattern, string, flags=0)从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。参数说明:

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

用group(num) 或 groups() 匹配对象函数来获取匹配表达式

获取方法 描述
group(num) 匹配整个表达式的字符串,group()可以一次输入多个组号,返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号
import re
string = r'<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" οnclick="navBar(this,\'#lq=\',false)">地图</a>'
pattern1 = "<a"
# 匹配是否在起始位置,是则返回在的位置,否则返回None
aa = re.match(pattern1,string)
print(aa.span())
pattern2 = "周志华"
bb = re.match(pattern2,string)
print(bb)
(0, 2)
None
# .* 表示任意匹配除换行符(\n,\r)之外的任何单个或多个字符
# .*? 贪婪模式,可匹配所有类型的字符
# ()表示我们要提取的内容
pattern3 = r"(.*)(周志华).*"
cc = re.match(pattern3,string)
print(cc.group(),"\n") # 要匹配的目标字符串
print(cc.group(1),"\n") #  第一组信息
print(cc.group(2),"\n") #  第二组信息
print(cc.groups()) # 获取所有的字符串信息
<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" onclick="navBar(this,\'#lq=\',false)">地图</a> <a href="http://map.sogou.com/#lq= 周志华 ('<a href="http://map.sogou.com/#lq=', '周志华')

1.2.2 re.search()函数【单个】

re.search(pattern, string, flags=0)遍历整个字符串并返回第一个成功的匹配,参数说明:

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

用group(num) 或 groups() 匹配对象函数来获取匹配表达式

获取方法 描述
group(num) 匹配整个表达式的字符串,group()可以一次输入多个组号,返回一个包含那些组所对应值的元组
groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号
import re
string = r'<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" οnclick="navBar(this,\'#lq=\',false)">地图</a>'
pattern = "<a"
# 匹配是否在起始位置,是则返回在的位置,否则返回None
aa = re.search(pattern,string)
print(f"{pattern} 第一个匹配的位置为:{aa.span()}")
<a 第一个匹配的位置为:(0, 2)
pattern = r"(a).*(周志华).*"
cc = re.search(pattern,string)
print(cc.span(1),"\n") # 返回匹配成功的整个字符串的索引
print(cc.group(0),"\n") # 匹配的目标字符串
print(cc.group(1),"\n") # 第一组信息
print(cc.group(2),"\n") # 第二组信息
print(cc.groups()) # 获取所有的字符串信息
(1, 2) a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" onclick="navBar(this,\'#lq=\',false)">地图</a> a 周志华 ('a', '周志华')

re.compile(pattern, flags=0)函数,用于编译正则表达式,生成一个正则表达式(pattern)对象,供 match()和 search()这两个函数使用。

import re
string = r'<a href="http://map.sogou.com/#lq=周志华" id="sogou_maps" οnclick="navBar(this,\'#lq=\',false)">地图</a>'
pattern = re.compile(r"周志华")
# 匹配是否在起始位置,是则返回在的位置,否则返回None
aa = pattern.search(string)
print(f"{pattern} 第一个匹配的位置为:{aa.span()}")
re.compile('周志华') 第一个匹配的位置为:(34, 37)

1.2.3 re.findall()函数【所有】

re.findall(pattern, string, flags=0)在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re
pattern = r"<a.*?>(.*?)</a>"
# result 为前面爬虫的爬取的网页数据
aa = re.findall(pattern,result)
aa[:3]
['高级搜索', '', '拆分关键词']

1.2.4 re.finditer()函数【所有】

re.finditer(pattern, string, flags=0)和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re
pattern = r"<a.*?>(.*?)</a>"
# result 为前面爬虫的爬取的网页数据
aa = re.finditer(pattern,result)
# for i in aa:
#     print(i.group(1))

1.2.5 re.split()分割匹配的字符串

re.split(pattern, string, maxsplit=0, flags=0)按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:

参数 说明
pattern 匹配的正则表达式
string 需要匹配的字符串
maxsplit 分隔次数,默认为0
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re
re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']

1.2.6 re.sub()函数检索和替换

re.sub(pattern, repl, string, count=0, flags=0)用于替换字符串中的匹配项,参数说明:

参数 说明
pattern 匹配的正则表达式
repl 替换的字符串,也可为一个函数
string 被替换的原始字符串
couont 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flages 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
import re
string = r'http://map.sogou.com/#lq=周志华'
pattern = "周志华"
print(re.sub(pattern,"西瓜书",string))
http://map.sogou.com/#lq=西瓜书

2 常用正则表达式

在线正则表达式测试网址

2.1 贪婪模式

贪婪模式:即无论是什么字符都能提取,".*?"。

import re
string = r'<a uigs-id="tab_adv" href="javascript:void(0);" class="js-settings-tab tab-a">高级2.Aa搜索</a>'
pattern = r"<a .*?>(.*?)</a>"
re.findall(pattern,string)
['高级2.Aa搜索']

2.2 中文信息

import re
string = r'<a uigs-id="tab_adv" href="javascript:void(0);" class="js-settings-tab tab-a">高级,2.Aa搜索</a> \
<a uigs-id="tab_adv" href="javascript:void(0);" class="js-settings-tab tab-a">高级2.Aa搜索</a>'
# 单个中文汉字模式(包括标点字符)
# pattern = '[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5]'
# 多个中文汉字模式(包括标点字符)
pattern = '[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5]+'
# 单个中文汉字模式,只提取汉字,不含标点符号
# pattern = '[\u4e00-\u9fa5]'
# 多个中文汉字模式,只提取汉字,不含标点符号
# pattern = '[\u4e00-\u9fa5]+'
re.findall(pattern,string)
['高级,', '搜索', '高级', '搜索']

2.3 匹配空白行

import re
pattern =r"\n\s*\r"
# result为前面爬虫所获取的网页源代码数据
ax = re.findall(pattern,result)
ax[0]
'\n    \r\n\r'

2.4 匹配网址

import re
pattern = r"[a-zA-z]+://[^\s]*"
re.findall(pattern,result,re.S)[:1]
['https://pb.sogou.com/pv.gif"};new']

这里就列举这几个了,其余可从网址上查看。在爬虫中,还是需要通过自己写正则表达式才能提取到我们需要的信息。

网页爬取常用正则表达式的介绍相关推荐

  1. 初探Scrapy爬虫框架之百度网页爬取

    初探Scrapy爬虫框架之百度网页爬取 scrapy框架及百度网页爬取与保存 一.scrapy框架简介 二.自己初使用的心得体会 1.爬虫之前明确目标 2.scrapy框架的简单使用流程 3.scra ...

  2. beautifulsoup网页爬虫解析_Python爬虫快速入门,静态网页爬取

    在开始之前,请确保你的电脑上已经安装好了BeautifulSoup库,可以通过在命令行中输入pip install beautifulsoup4来进行安装. 一.数据解析 在爬取之前,我们需要检测下响 ...

  3. Python爬虫快速入门,静态网页爬取!

    在开始之前,请确保你的电脑上已经安装好了BeautifulSoup库,可以通过在命令行中输入pip install beautifulsoup4来进行安装. 一.数据解析 在爬取之前,我们需要检测下响 ...

  4. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  5. 第二十八篇 网页实战之静态网页爬取,四大案例,小说,书,图片等抓取操作

    心得:不知道从什么时候开始,喜欢上了思考,完全可以把自己沉浸在自己的程序中,看着自己一点点的累积,慢慢的成长,证明这一天没有白白浪费掉,感谢还在认真的你. 自己在学习过程中总结出来的爬虫的过程: 1. ...

  6. 爬取电影资源之网页爬取篇(python)

    不知道大家平常喜不喜欢待在宿舍一个人看电影? 作为一个高龄屌丝,电影对我来说是必不可少的.平常无聊时自己一个人待在宿舍看看电影,看看书. (人闲下来就会胡思乱想,不能让寂寞侵蚀自己的内心) 其实还是喜 ...

  7. Python 单网页爬取

    目录 任务描述 相关知识 网络爬虫 网络爬虫:载入 网络爬虫:动态载入 网络爬虫:解析 编程要求 测试说明 任务描述 本关任务:编写一个爬虫,爬取 www.jd.com 网的 title. 相关知识 ...

  8. mac如何用python爬网页数据_Mac——利用Python进行网页爬取

    Mac--利用Python进行网页爬取 目标:利用Python爬取网页中的指定内容,例如,爬取百度百科网页中四川省的别名.html 输出:四川省的别名为:川.蜀.天府之国python 我的经验,网页爬 ...

  9. Python网络爬虫数据采集实战:同花顺动态网页爬取

    前文的爬虫都建立在静态网页基础之上,首先通过请求网站url获取到网页源代码.之后对源代码进行信息提取进而存储即可,本文则针对动态网页进行数据采集,首先介绍Ajax相关理论,之后实战爬取同花顺动态网页, ...

  10. python手机壁纸超清_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

最新文章

  1. python学习高级篇(part4)--内置函数issubclass和isinstance
  2. BRAND-NEW OF DOUBLES工作组合的新作品
  3. 关于怎么怎么把 unsingned char 数据转换为 Opencv 的Mat类型,并且吧图像显示出来
  4. python django flask介绍_django和flask哪个值得研究学习
  5. 免费解决vcruntime140.dll文件缺失 - 资源篇
  6. stackless python初体验
  7. 初识 Vue(10)---(计算属性的 setter 和 getter)
  8. python hash函数_Python hash()函数
  9. WebSphere MQ通道的建立
  10. 8.软件架构设计:大型网站技术架构与业务架构融合之道 --- 高并发问题
  11. NPAPI插件无法加载,有可能跟JDK相关
  12. python爬虫爬取英文考研词汇
  13. 6713芯片手册_tms320c6713 gpio_tms320c6713_dsp6713中文手册
  14. 多彩三角活动策划方案PPT模板
  15. JAVA计算机毕业设计电影视频在线点播系统Mybatis+系统+数据库+调试部署
  16. 如何把源代码格式复制到WPS文档中
  17. 一些前端的开发环境配置
  18. SpringBoot+LayUI+MybatisPlus+Echarts图表 前后端分离 实现数据统计功能
  19. 【Scratch考级99图】图10-等级考试scratch 画正五边形
  20. 关系数据库:专门关系运算

热门文章

  1. 修改 exchange服务器,修改或删除 Exchange 2010
  2. 「Mac小技巧」教你如何解决WiFi的国家地区代码冲突
  3. 汽车故障诊断技术【11】
  4. PyQt4入门教程(1)_PyQt介绍及准备工作
  5. bat批处理文件修改注册表
  6. webpower中小企业邮件营销指南
  7. [Linux]----马哥Linux运维共208讲(初级+中级+高级+必备软件+PPT)01_04_Linux操作系统基础
  8. scratch制作彩虹猫病毒模拟器
  9. [后端人员耍前端系列]KnockoutJs篇:快速掌握KnockoutJs
  10. CodeSmith 7.01破解