【爬虫】一、BeautifulSoup库

2023-11-13

文档内容为本人观看北京理工大学嵩天老师公开课的听课笔记与实践总结,图片为从该课程下载资料的截图,感谢嵩老师。

Key_point:网页内容提取实际上是对标签的内容进行提取,其关键是标签的获取和标签感兴趣内容的提取。获取标签用beautifulsoup/beautifulsoup.tag.标签名称的方法,例如soup.p或者soup.body.p,soup.P.b任何标签内容的获取都可以用用tag.name/attrs等直接访问python类属性的方法。

逻辑过程:标签树→标签或者标签集合→标签内容

一、BeautifulSoup库入门

1、理解

该库的作用为:定向网络的数据爬取与网页解析。BS类是对Tag类的继承。提供了html文档到python对象的映射。可以简单地理解为BS将html封装成一个标签集合,我们可以通过标签名字来访问其包含的标签对象,例如.a、.body等,若相同标签有多个则只返回第一个。如果想全部检索,可以使用后面的find_all方法。

2、Tag基本方法

可以分为两类,分别是访问自身的方法和遍历方法。
访问自身的方法包括以下四种:
在这里插入图片描述
值得注意的是,本来tag.string是访问标签的字符串部分,但是实际上在有嵌套的标签中,会访问失败,返回值为空,当用于简单的标签(不含嵌套时)可以正常的使用,一种补救的方法是用.get_text()方法,但返回的是该标签内的所有文本信息,即包含被嵌套标签的string。

遍历其他标签的方法包括:下行遍历、上行遍历、平行遍历。
在这里插入图片描述

下行遍历:

在这里插入图片描述
.contents返回子标签列表,列表元素仍为tag类型。
.children返回迭代类型,不能直接访问,需要用for循环来遍历。
for child in soup.body.children:
print(child)
.decendants方法在jupyter测试时候报错,用pycharm正常,不知何故。(原来是单词拼错了)

// 子孙节点
for son in soup.body.descendants:
         print(son)

上行遍历

在这里插入图片描述
.parent返回父(复合)标签,这个父标签支持遍历,内容是该标签的contents,实际上,实际上只要是标签就有.contents,就支持遍历。

.parents返回有tag和BS类构成的generator类,例如:
在这里插入图片描述
在这里插入图片描述
类型分别是:
1 <class ‘bs4.element.Tag’>
2 <class ‘bs4.element.Tag’>
3 <class ‘bs4.element.Tag’>
4 <class ‘bs4.BeautifulSoup’>
也就是说:上行遍历的终点是beautifulsoup类也就是根。

平行遍历:

首先,具有同一个父节点的标签节点才具有平行关系,如下图所示:
在这里插入图片描述
平行遍历的方法包括:
在这里插入图片描述

平行遍历(无论前后)即是在父节点的.contents列表里面遍历,所以有时会有换行符。
最后,bs4库的prettify()方法可以使得bs类对象更美观的显示,bs4和python3都默认utf-8编码,所以最好用3以上版本开发。
find_all方法和正则表达式结合,经常用于信息检索。find_all可以使用标签名称检索、属性值检索、导航字符串检索等。

3、Find_all方法:

Find方法是返回find_all内容列表的第一个元素。常用约束项:标签名称name,属性内容attrs,字符串内容。
例如:

for p in soup.find_all(‘p’) # soup中的所有p标签
for p in soup.find_all([‘a’, ‘p’]) # soup中所有的a标签和p标签
for tag in soup.find_all(True) # soup中的所有标签
soup.find_all(‘p’, ‘course’) # 所有属性值包含course的p标签
soup.find_all(attrs=‘course’) # 所有属性值为course的标签
for tag in soup.find_all(attrs=re.compile(‘py’)): # 属性中包含py
soup.find_all(‘p’, string=re.compile(‘python’)) # 字符串区域包含python的所有p标签

注意:soup.find_all 和 正则库的findall区别很大,后者是在目标字符串中严格按照pattern去匹配,而soup的方法如果加入正则对象,例如上面第六句,name返回的是所有包含正则吻合的标签集合,举例来说:

 soup.find_all(attrs=re.compile('py')):  # 属性中包含py

只要属性字典中的 class 对应的值包含‘py’而不要求严格为‘py’,name都会作为结果之一返回。

输出结果:
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
{'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>
{'href': 'http://www.icourse163.org/course/BIT-1001870001', 'class': ['py2'], 'id': 'link2'}

关于find_all方法的attrs这个参数有必要提一下:一般而言一个标签的属性字典包括很多的键值对,例如:

{'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}

阅读源码可知:如果我们的attrs参数不是以字典的形式传入,那么默认该键为class,如果想用除去class的键作为约束,那么attrs必须用字典传入。例如:

for tag in soup.find_all(attrs=re.compile('org')): 
    print(tag)
    print(tag.attrs)

for tag in soup.find_all(attrs={"href":re.compile('org')}): 
    print(tag)
    print(tag.attrs)


输出结果:
上面代码的输出:[]
下面代码的输出:
<a class="py1" href="http://www.icourse163.org/course/BIT-268001" id="link1">Basic Python</a>
{'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
<a class="py2" href="http://www.icourse163.org/course/BIT-1001870001" id="link2">Advanced Python</a>
{'href': 'http://www.icourse163.org/course/BIT-1001870001', 'class': ['py2'], 'id': 'link2'}

代码链接:BeautifulSoup练习

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【爬虫】一、BeautifulSoup库 的相关文章

随机推荐

  • redis 由浅入深 之进阶(发布与订阅、事务、连接和Reids服务器)

    Redis发布与订阅 Redis 发布订阅 pub sub 是一种消息通信模式 发送者 pub 发送消息 订阅者 sub 接收消息 Redis 客户端可以订阅任意数量的频道 下图展示了频道 channel1 以及订阅这个频道的三个客户端 c
  • 干货!一种适用性、可拓展性强的离线强化学习方法

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 近年来 离线强化学习算法 Offline Reinforcement Learning 由于其不与环境交互 仅从数据集中学习策略 而得到越来越多的关注 与离线策略强化学习 Off
  • 普通电脑用u盘安装服务器系统安装教程,Windows Server 2016使用U盘安装需要哪些步骤 硬盘安装Windows Server 2016图文教程...

    服务器操作系统Windows Server 2016如何安装 Windows Server 2016如何使用U盘安装 Windows Server 2016如何在硬盘上安装 Windows Server 2016核心安装和桌面体验安装有什么
  • PyQt4(简单界面)

    import sys from PyQt4 import QtCore QtGui app QtGui QApplication sys argv widget QtGui QWidget widget resize 600 400 wid
  • Django 项目 ModuleNotFoundError: No module named ‘mysqldb‘

    出现这种情况一般多为这两种原因导致 1 没安装相关包导致的 这种情况好解决 直接 pip3 install mysqldb 2 已安装相关包 仍然报错 这种情况大概率是因为包路径原因导致的 解决举例如下 from mysqldb impor
  • C++11中挂起线程

    C 11中用sleep untill 函数挂起线程 define CRT SECURE NO WARNINGS include
  • H5唤起关注公众号页面

    正好做一个抽奖活动 需要关注获取抽奖次数来抽奖 判断是否关注 1 登录微信公众平台 2 点击微信号头像右击查看源代码 3 找到源代码中以下代码 将uin base64这个参数值带入以下链接 https mp weixin qq com mp
  • 模拟电路设计(7)--- 增强型MOSFET

    这篇我们开始讲一讲MOSFET Metal Oxide Semiconductor Field Effect Transistor MOS FET从本质上来看和J FET一样也属于 多子 器件 但从控制机理上有所不同 增强型MOSFET器件
  • 18个堪称神器的命令行工具,高效运维必备

    上期入口 24个 CSS 高级技巧合集 本资源原链接地址 18个堪称神器的命令行工具 thefuck 命令行打错了以后 打一个fuck就会自动纠正 GitHub https github com nvbn thefuck ag 比 grep
  • 【计算机网络5】运输层#UDP协议

    一 运输层作用 运输层向其上层的应用层提供通信服务 当应用层的某个进程发送一个报文时 这个报文便会在应用层上被添加相应的控制信息 然后交付给其下层的运输层 运输层收到消息之后再添加控制信息 然后交付其下层 当网络边缘的两台计算机使用网络的核
  • Windows 下安装sql server 2016(附安装包资源)

    首先之前安装过sql server 但是只是在控制面板卸载的 请参考一下博文 完全卸载sql server windows 下如何完全卸载SQL server 这是我的安装包 需要的小伙伴可以自行取用 链接 https pan baidu
  • GPT专业应用:生成实习报告

    正文共 1070 字 阅读大约需要 4 分钟 大学生必备技巧 您将在4分钟后获得以下超能力 快速生成实习报告 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 Kim 编辑者 Linda 图片由Lexica 生
  • c++第一次实现双向链表附迭代器

    双向链表 下一步就是类模板参数和迭代器实现一些简单算法 代码量等知识储备够了再优化 异常还理解不了 ifndef LIST H define LIST H include
  • 本周大新闻|Vision Pro头显重磅发布;苹果收购AR厂商Mira

    本周XR大新闻 上周Quest 3发布之后 本周苹果MR头显Vision Pro正式发布 也是本周AR VR新闻的重头戏 AR方面 苹果发布VST头显Vision Pro 虽然本质是台VR 但以AR场景为核心 以及visionOS visi
  • time time_t tm用法

    最近搞视频检索 涉及到很多时间的计算 顺便记录下一些基本用法 一 gmtime用法 include
  • Python 快乐数

    快乐数 也不多说它的定义了 直接说相关的概念吧 如下 所有不快乐数的数位平方和计算 最后都会进入 4 16 37 58 89 145 42 20 4 的循环中 已知规律 1 4 中只有 1 是快乐数 5 的数字要么回归到 1 要么回归到 4
  • 奇偶校验位

    在串行通信中 奇偶校验位通常是由UART这样的接口硬件生成 校验的 在接收方 通过接口硬件中的寄存器的状态位传给 CPU 以及操作系统 错误数据的恢复通常是通过重新发送数据 这个过程通常由如操作系统输入输出程序这样的软件处理的
  • (2)Gymnasium--CartPole的测试

    1 主要参考 1 CartPole 强化学习详解1 DQN Oxalate c的博客 CSDN博客 2 官方文档 推荐 Cart Pole Gymnasium Documentation 2 相关说明 2 1 动作空间 取值 0 1 表示推
  • python数组初始化_python怎么初始化数组

    因为画图中x轴与y轴的数据通常为数组格式的数据 所以先总结一下如何初始化数组 1 list得到数组 通过array函数传递list对象 L 1 2 3 4 5 6 a np array L 若传递的是多层嵌套的list 将创建多维数组 b
  • 【爬虫】一、BeautifulSoup库

    文档内容为本人观看北京理工大学嵩天老师公开课的听课笔记与实践总结 图片为从该课程下载资料的截图 感谢嵩老师 Key point 网页内容提取实际上是对标签的内容进行提取 其关键是标签的获取和标签感兴趣内容的提取 获取标签用beautiful