使用正则表达式解析网页是Python的一个擅长的领域。如果还想更加深入地学习正则表达式,或者在平时经常用到正则表达式,可以进入Regular Expression 101网站学习,网站地址为 https://regex101.com/ 。

接下来会讲解爬虫抓取网页后,Python如何用正则表达式进行网页解析。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的特定字符和这些特定字符的组合组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑。举一个简单的例子,假设字符串为'我们爱吃苹果,也爱吃香蕉',我们需要提取其中的水果,用正则表达式匹配'爱吃'后面的内容就可以找到'苹果'和'香蕉'了。

为了利于我们改善优化接下来的内容贴合度,可以填写下您的Python掌握程度。

在提取网页中的数据时,我们可以先把源代码变成字符串,然后用正则表达式匹配想要的数据。刚刚接触正则表达式时可能会觉得晦涩难懂,但是使用正则表达式可以迅速地用极简单的方式达到字符串的复杂控制。

表5-1是常见的正则字符和含义。如果想了解更为详细的正则表达式文档,可以访问: https://docs.python.org/3/library/re.html 。

表5-1 常见的正则字符和含义

首先,我们介绍Python正则表达式的3种方法,分别是re.match、re.search和re.findall。

 re.match方法

re.match的意思是从字符串起始位置匹配一个模式,如果从起始位置匹配不了,match()就返回none。

re.match的语法为re.match(pattern,string,flags=0),其中pattern是正则表达式,包含一些特殊的字符,string为要匹配的字符串,flags用来控制正则表达式的匹配方式,如是否区分大小写、多行匹配等。

例如,我们想使用两个字符串匹配并找到匹配的位置,可以使用:


import rem = re.match('www', 'www.santostang.com')print ("匹配的结果: ", m) print ("匹配的起始与终点: ", m.span()) print ("匹配的起始位置: ", m.start())print ("匹配的终点位置: ", m.end())

得到的结果为:

匹配的结果: <_sre.sre_match object>

匹配的起始与终点: (0,3)

匹配的起始位置: 0

匹配的终点位置: 3

上述例子中的pattern只是一个字符串,我们也可以把pattern改成正则表达式,从而匹配具有一定模式的字符串,例如:


line = "Fat cats are smarter than dogs, is it right?"m = re.match( r'(.*) are (.*?) ', line)print ('匹配的整句话', m.group(0))print ('匹配的第一个结果', m.group(1))print ('匹配的第二个结果', m.group(2))print ('匹配的结果列表', m.groups())

得到的结果为:

匹配的整句话Fat cats are smarter

匹配的第一个结果Fat cats

匹配的第二个结果smarter

匹配的结果列表('Fat cats','smarter')

为什么这里(.*)匹配了Fat cat,而(.*?)只匹配了smarter呢?

这就涉及正则表达式匹配中默认的贪婪模式总是尝试匹配尽可能多的字符。在上述例子中,(.*)are会尽量匹配最多的字符,因此把Fat cat匹配了。非贪婪模式则相反,总是尝试匹配尽可能少的字符,are(.*?)会尽量匹配尽量少的字符,因此把smarter匹配了。

为什么要在match的模式前加上r呢?

r'(.*)are(.*?).*'前面的r意思是raw string,代表纯粹的字符串,使用它就不会对引号里面的反斜杠''进行特殊处理。要解释清楚,可以举个例子。例如:


print ('HelloWorldPython')

结果为:

HelloWorld

Python

可以看到里面的''已转义为换行符,但是'W'没有转义,这是因为'W'在字符串转义中没有对应特殊字符。如果现在需要不对''转义,原封不动输出'HelloWorldPython'呢?

第一种方法我们可以写成


print ('HelloWorldPython')

两个反斜杠的“字符串转义”会把""转义为""。

第二种方法是使用r'…',原始字符串的方法,不会对引号里面的反斜杠''进行特殊处理。


print (r'HelloWorldPython')

以上是字符串转义中raw string的用法,那么正则表达式的转义怎么用呢?


import re string = r'27' m = re.match('(d+)', string)print (m.group(1)) # 结果为:2n = re.match(r'(d+)', string) print (n.group(1)) # 结果为:2

首先需要知道的是,正则表达式字符串需要经过两次转义,这两次分别是上面的“字符串转义”和“正则转义”

正则表达式如果不用r'…'方法的话,就需要进行“字符串转义”和“正则转义”。在上述案例中,需要匹配r'27'中的字符"",使用编程语言表示的正则表达式里就需要4个反斜杠"":前两个反斜杠""和后两个反斜杠""各自在字符串转义成一个反斜杠"/",所以4个反斜杠""就转义成了两个反斜"",这两个反斜杠""最终在正则表达式转义成一个反斜杠""。

如果使用r'…'方法的话,不用进行字符串转义,直接进入第二步“正则转义”,在正则转义中""被转义为了"",这个例子中可以使用r""表示。

5.1.2 re.search方法

re.match只能从字符串的起始位置进行匹配,而re.search扫描整个字符串并返回第一个成功的匹配,例如:


import rem_match = re.match('com', 'www.santostang.com')m_search = re.search('com', 'www.santostang.com')print (m_match)print (m_search)

得到结果为:

None

其他方面re.search与re.match一样,可以参照上面的re.match来操作。

re.findall方法

上述match和search方法中,我们只能找到一个匹配所写的模式,而findall可以找到所有的匹配,例如:


import rem_match = re.match('[0-9]+', '12345 is the first number, 23456 is the sencond')m_search = re.search('[0-9]+', 'The first number is 12345, 23456 is the sencond')m_findall = re.findall('[0-9]+', '12345 is the first number, 23456 is the sencond')print (m_match.group())print (m_search.group())print (m_findall)

上述代码的'[0-9]+'表示任意长度的数字,然后在后面的字符串中进行匹配。

运行上述代码,得到的结果是:

12345

12345

['12345','23456']

findall与match、search不同的是,findall能够找到所有匹配的结果,并且以列表的形式返回。当爬取博客文章的标题时,如果提取的不只是一个标题,而是所有标题,就可以用findall。

博客的文章标题部分的HTML代码如下:


Hello world!

07月04日 Python 网络爬虫 1条评论

抓取博客主页所有文章标题的Python代码如下:


import requestsimport relink = "http://www.santostang.com/"headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers)html = r.texttitle_list = re.findall('

(.*?)

',html)print (title_list)


以上代码用于提取博客主页上所有文章的标题,这里使用findall匹配,使用'

(.*?)

'正则表示式表示对所有满足此条件的结果。带有括号,表示只提取其中的(.*?)部分。运行代码,得到的结果是:

['4.3通过selenium模拟浏览器抓取','4.2解析真实地址抓取','第四章-动态网页抓取(解析真实地址+selenium)','《网络爬虫:从入门到实践》一书勘误','Hello world!']

这样就把所有的标题提取出来了。

了解更多,请点击获取。

beautifulsoup网页爬虫解析_Python爬虫3步曲:5分钟学习用Python解析网页相关推荐

  1. python爬虫自学网站_Python爬虫3步曲:5分钟学习用Python解析网页

    使用正则表达式解析网页是Python的一个擅长的领域.如果还想更加深入地学习正则表达式,或者在平时经常用到正则表达式,可以进入Regular Expression 101网站学习,网站地址为 http ...

  2. python json有什么用_为什么要学习用Python解析JSON数据?

    "JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采 ...

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

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

  4. python网页结构分析图_Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...

  5. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  6. python爬取网页数据流程_Python爬虫爬取数据的步骤

    爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多 ...

  7. python scrapy爬虫视频_python爬虫scrapy框架的梨视频案例解析

    之前我们使用lxml对梨视频网站中的视频进行了下载 下面我用scrapy框架对梨视频网站中的视频标题和视频页中对视频的描述进行爬取 分析:我们要爬取的内容并不在同一个页面,视频描述内容需要我们点开视频 ...

  8. python爬虫知识_Python 爬虫技术分享

    什么是"爬虫"?www.xihefangpei.com 简单来说,写一个从web上获取需要数据并按规定格式存储的程序就叫爬虫: 爬虫理论上步骤很简单,第一步获取html源码,第二步 ...

  9. python爬虫基本原理_Python爬虫【一】爬虫的基本原理

    一.爬虫基本原理 1.获取网络数据 用户方式:浏览器提交请求->下载网页代码->解析/渲染成页面 爬虫方式:模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放 ...

最新文章

  1. 使用 Azure CLI 管理 Azure 虚拟网络和 Linux 虚拟机
  2. Fiddler 抓包高级进阶篇-天罗地网抓包大法
  3. 开发过程中编写的一些批处理
  4. 如何搭建一套完整的深度学习系统?
  5. 狗是不是最和其它动物合得来的一种动物?
  6. 一个tile布局的下拉框
  7. 2.窗口大小改变和侧边栏收缩的时候,echarts图表的自适应
  8. cas4.0 mysql_【SSO单点系列】:CAS4.0 CAS整合SpringMVC+MyBatis实现数据库校验(04)
  9. 曼哈顿距离最小生成树(树状数组)
  10. 将文本中的各个单词的字母顺序翻转(Java)
  11. Mac ssh远程登录腾讯云的解决方案
  12. 华为OD机试 - 荒地(Java JS Python)
  13. 2021年前装首破5万辆 AR HUD“棋逢对手”,竞逐量产桂冠
  14. 如何修改pdf文件中文字的大小及颜色
  15. MyBatis-Plus 分页查询
  16. 【空间分析】地理探测器法原理及应用
  17. 互联网人才泡沫:百度腾讯阿里大打人才争夺战
  18. creo 6.0—12creo样条曲线绘制、13 creo草绘——偏移、加厚、投影
  19. 不小心把502胶水溅入眼中怎么办?会失明吗?
  20. 电科矩阵理论CH2向量与矩阵的范数--证明题

热门文章

  1. matlab全景图素材,科学网—meshlab查看360度全景图像 - 王琳的博文
  2. 计算机基础知识 笔试,计算机基础知识笔试题
  3. 学硕论文选题计算机,计算机硕士论文题目分享
  4. android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)
  5. 计算机接口实验0832,现代计算机接口实验 (四)0832实验
  6. html table 转置,jQuery+CSS实现的table表格行列转置功能示例
  7. 从零开始学php 光盘,从零开始学PHP(第2版)(含DVD光盘1张)
  8. 学习笔记之grub应用
  9. 大数据学情分析_大数据时代如何轻松做好学情分析
  10. SpringBoot如何整合定时任务调度