学习笔记


文章目录

  • 正则表达式
    • re模块的使用
      • 正则表达式元字符
      • 贪婪匹配和非贪婪匹配
        • 贪婪模式
        • 非贪婪模式
      • 正则表达式分组

正则表达式

re模块的使用

re模块在爬虫中常用的方法:

re.findall()
re.compile()
pattern.finall()

匹配方式1(re.findall)

list01=re.findall('正则表达式',html,re.S)
#html就是我们获取的网页源代码字符串
#re.S为flag扩展参数,re.S表示使【.】可以匹配换行。这样【.】就可以匹配任意字符了
#返回值为包含符合正则表达式的字符串的列表

关于flag扩展参数,详细请见正则表达式教程。

匹配方式2(re.compile与pattern.findall)

#创建正则表达式对象
pattern = re.compile('正则表达式',re.S)
list02 = pattern.findall(html)

举个例子

代码:

import res01 = 'abchfgasca\nc'
list01 = re.findall('a.c', s01, re.S)
print(list01)
print('-'*15)pattern = re.compile('a.c')
list02 = pattern.findall(s01)
print(list02)

结果:

['abc', 'asc', 'a\nc']
---------------
['abc', 'asc']

正则表达式元字符

元字符的详细知识点,具体看正则表达式教程。

元字符 含义
. 匹配任意一个字符(不包括\n)
\d 匹配任意数字
\s 匹配空白字符
\S 匹配非空白字符
* 出现0次或多次
+ 出现1次或多次
? 出现0次或1次
{m,n} 出现m-n次

贪婪匹配和非贪婪匹配

贪婪和非贪婪的详细知识点,具体看正则表达式教程。

贪婪模式

在整个表达式匹配成功的前提下,尽可能多的匹配

非贪婪模式

在整个表达式匹配成功的前提下,尽可能少的匹配

举个例子

要求:我想要匹配HTML页面中三对段落标签

中的兔子名称。

贪婪模式:

import rehtml = \
"""<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>正则表达式</title>
</head>
<body><p>黑白道奇</p><p>垂耳兔</p><p>北极兔</p>
</body>
</html>
"""
pattern = re.compile(r'<p>.+</p>', re.S)
list01 = pattern.findall(html)
print(list01)

结果:

  ['<p>黑白道奇</p>\n\t<p>垂耳兔</p>\n\t<p>北极兔</p>']

贪婪模式中,列表中只匹配到了一个结果,这个结果显然不符合我们的要求。

非贪婪模式:

import rehtml = \
"""<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>正则表达式</title>
</head>
<body><p>黑白道奇</p><p>垂耳兔</p><p>北极兔</p>
</body>
</html>
"""
pattern = re.compile(r'<p>.+?</p>', re.S)
list01 = pattern.findall(html)
print(list01)

结果:

['<p>黑白道奇</p>',  '<p>垂耳兔</p>', '<p>北极兔</p>']

非贪婪模式下,我们的列表中存放了3个结果,且每一对段落标签中都有我们的兔子名称,基本符合我们的要求。

为啥说基本符合要求,而不是完全满足?因为我们只想要兔子名称,不想要段落标签

。所以,此时,我们就要使用正则表达式中的分组来解决这个问题了!

正则表达式分组

分组的详细知识点,请看正则表达式教程。

作用

在完整的模式中定义子模式,将每个圆括号中的子模式匹配出来的结果提取出来。

爬虫应用

①在网页中,想要提取什么内容,就在正则表达式中对应位置加()

②如果有2个及以上分组(),则结果中以元组形式显示 [(),(),()]

举个例子1

代码:

import res = 'A B C D'
p1 = re.compile('\w+\s+\w+')
print(p1.findall(s))#1个子组
p2 = re.compile('(\w+)\s+\w+')
#只输出子组中匹配结果
print(p2.findall(s))#多个子组
p3 = re.compile('(\w+)\s+(\w+)')
#按照元组形式,将各个子组中匹配结果输出
print(p3.findall(s))

结果:

  ['A B', 'C D'] ['A', 'C']  [('A', 'B'), ('C', 'D')]

举个例子2

我们有如下HTML页面结构:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>正则表达式</title>
</head>
<body><div class="animal"><p class="name"><a title="Tiger"></a></p><p class="content">Two tigers two tigers run fast</p></div><div class="animal"><p class="name"><a title="Rabbit"></a></p><p class="content">Small white rabbit white and white</p></div></body>
</html>

要求:我们想要提取每个div标签中,段落标签p内,标签a里的title参数值【“Tiger”、“Rabbit”】和字符串【Two tigers two tigers run fast、Small white rabbit white and white】

代码:

import rehtml = \
"""
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>正则表达式</title>
</head>
<body><div class="animal"><p class="name"><a title="Tiger"></a></p><p class="content">Two tigers two tigers run fast</p></div><div class="animal"><p class="name"><a title="Rabbit"></a></p><p class="content">Small white rabbit white and white</p></div></body>
</html>
"""pattern1 = re.compile(r'<div class="animal">.+?<p class="name">.+?<a title=(.+?)></a>', re.S)
pattern2 = re.compile(r'<div class="animal">.+?<p class="content">(.+?)</p>', re.S)s01 = pattern1.findall(html)
s02 = pattern2.findall(html)print(s01)
print(s02)

结果:

['"Tiger"', '"Rabbit"']
['\n\t\t\tTwo tigers two tigers run fast\n\t    ', '\n\t\t\tSmall white rabbit white and white\n\t    ']

当然,可以把两个子组放在一个正则表达式中,那么输出结果,就是一个包含两个元祖的列表。在这里,我就不写了,大家可以自己试一下。

现在我们从列表里拿出我们的值,并将值左右两侧的空格去掉:

for item01, item02 in zip(s01, s02):print('动物名称:', item01.strip())print('动物描述:', item02.strip())

结果:

动物名称: "Tiger"
动物描述: Two tigers two tigers run fast
动物名称: "Rabbit"
动物描述: Small white rabbit white and white

利用python爬虫(part3)--正则表达式相关推荐

  1. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

  2. 小游戏,利用Python爬虫之制作诗歌接龙

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:数据森麟 ( 想要学习Python?Python学习交 ...

  3. 手把手教你利用 python 爬虫分析基金、股票

    手把手教你利用 python 爬虫分析基金.股票 文章目录 手把手教你利用 python 爬虫分析基金.股票 第一步:基金数据爬取 第二步:股票增持计算 第三步:好股基金选取 桌面程序 exe 从前大 ...

  4. 利用python爬虫与数据分析,打造最强玩法,轻松成为大神级玩家!

    前言: 最近迷上了一款游戏,但是作为一名程序员的我是不可能只玩游戏的,我必须把它的官网数据采集下来! 环境: windows python3.6.5 模块: requests jsonpath pyg ...

  5. 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...

    [爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...

  6. Python爬虫 | 利用python爬虫获取想要搜索的数据

    这篇文章主要介绍了利用Python爬虫采集想要搜索的信息(利用某du的接口实现)并且处理掉它的反爬手段,文中示例代码很详细,具有一定的学习价值,感兴趣的小伙伴快来一起学习吧. ☀️新人小白博主

  7. python爬虫怎么赚钱-个人利用Python爬虫技术怎么挣钱-10万被动收入...

    我利用Python爬虫技术年挣10万被动收入的方式,在正式聊Python爬虫技术之前,先来说说挣钱的事,说说作为一个自由职业或兼职者怎么利用爬虫来挣钱. 个人爬虫挣钱方法大致如下 爬虫技术挣钱方法1: ...

  8. 05、Python爬虫之正则表达式常用方法(超全)

    文章目录 前言 一.search()函数 二.match()函数 三.compile()函数 四.findall()函数 五.sub()函数 六.subn()函数 七.split()函数 八.补充说明 ...

  9. python爬虫赚钱的经历-个人利用Python爬虫技术怎么挣钱-10万被动收入

    我利用Python爬虫技术年挣10万被动收入的方式,在正式聊Python爬虫技术之前,先来说说挣钱的事,说说作为一个自由职业或兼职者怎么利用爬虫来挣钱. 个人爬虫挣钱方法大致如下 爬虫技术挣钱方法1: ...

最新文章

  1. FFmpeg windows软件开发环境搭建
  2. 是否可以在其范围之外访问局部变量的内存?
  3. 源码编译安装 swoole
  4. Database----Cursor
  5. 如何通过VC的 CHttpFile 抓取网页内容
  6. Windows远程文件拷贝openEuler--WinSCP
  7. 局部内部类 java 1614958356
  8. 短视频直播一对一源码“皇冠”花落谁家
  9. C++中容器的使用(二)
  10. python鼠标选中文本内容_【求助】使用Python脚本如何获取Windows中选中的文本
  11. 财务系统flex和oracle,ORACLE EBS财务科目FLEX FIELD的添加
  12. 2. Ruby下载安装
  13. 微信小程序请求本地服务器测试成功
  14. RV32G下lui/auipc和addi结合加载立即数时的补值问题
  15. win10更改C盘下的用户文件夹名
  16. 服务器提示临时文件已满,为什么显示“临时文件夹已满或不能访问”
  17. Spring注解@Value在controller无法获取到值
  18. mount的挂载远程服务器文件夹
  19. 【JS】console.log()打印出五彩斑斓的黑
  20. Ubuntu16.04:GTX1650的显卡驱动安装

热门文章

  1. mysql数据库replace写入_MySQL数据库replace into 用法(insert into 的增强版)
  2. Java中return的用法
  3. Android 弹出对话框
  4. golang为LigerUI编写简易版本web服务器
  5. SectionIndexer中的getSectionForPosition()与getPositionForSection()解惑
  6. 三方协议,档案,工龄,保险,户口,
  7. Linux学习笔记三--vim
  8. 让你的C程序更有效率的10种方法
  9. 有关Rating组件的研究——Silverlight学习笔记[41]
  10. 使用windows 7加入windows server 2008的域!