Python网络爬虫 学习笔记(2)BeaufitulSoup库

news2024/11/25 23:19:48

文章目录

    • BeautifulSoup库的基本介绍
      • HTML标签的获取和相关属性
      • HTML文档的遍历
      • prettify()方法
    • 使用BeautifulSoup库对HTML文件进行内容查找
      • 信息的标记的相关概念(非重点)
      • find_all()方法(重点)
    • 综合实例:爬取软科2022中国大学排名

承接上文:Python网络爬虫 学习笔记(1)requests库爬虫

BeautifulSoup库的使用背景:即使我们可以通过requests库获得网页的text信息,但是这个text信息只是网页的源代码,我们需要从这个源代码中寻找我们需要的信息,这时候就可以使用BeautifulSoup库来帮助我们实现目的。

BeautifulSoup库的基本介绍

HTML标签的获取和相关属性

Beautifulsoup库概述

  • 一个能够解析HTML和XML文件的功能库。
  • 由于一个HTML文档或XML文档对应一个标签树,因此也可以说,该库是解析、遍历、维护标签树的功能库。
  • 该库可以将任意一个标签树转换为一个BeautifulSoup类的对象。
  • HTML/XML文档、标签树和BeautifulSoup对象之间是一一对应的关系。

最常用的库导入方式from bs4 import BeautifulSoup

BeautifulSoup类对象创建

变量名=BeautifulSoup(HTML文件名/XML文件名,解析器)
  • HTML文件名/XML文件名:通过request库的get函数获取的Response对象,其text域即为一个HTML或XML文件,因此可以用来作为参数。
  • 解析器:当创建BeautifulSoup对象时需要指定解析器,用于表示文档的类型。自带的对HTML文档的解析器是"html.parser",一般情况下使用这个解析器即可。

BeautifulSoup类的基本元素

标签

  • 介绍:最基本的信息组织单元,分别用<>和</>标明开头和结尾。
  • 使用方式BeautifulSoup变量名.标签名

备注:如果存在多个名字相同的标签,则只会返回第一个标签对应的内容。

标签名

  • 介绍:< p >…< /p >的标签名为p。
  • 使用方式BeautifulSoup变量名.标签名.name

标签的属性

  • 介绍:以字典的形式进行组织。
  • 使用方式BeautifulSoup变量名.标签名.attrs
  • 返回内容:一个字典,包括标签的各个属性的信息。

标签内非属性字符串:

  • 介绍:即一对标签之间的内容,以字符串进行表示。
  • 使用方式BeautifulSoup变量名.标签名.string

内容注释

  • 介绍:标签内字符串的注释部分。
  • 使用方式:和获取标签内字符串相同,需要通过返回值类型进行区分。

实战案例(BeautifulSoup对象的创建和标签的使用)

# 首先需要导入requests库和BeautifulSoup类
import requests
from bs4 import BeautifulSoup
# 使用get方法爬取测试网站的内容
r=requests.get("https://www.baidu.com/")
# 对可能抛出异常的部分放入try块中
try:
          # 检测Response对象的状态码,判断是否抛出异常
          r.raise_for_status()
          # 如果header中不存在charset字段,则encoding采用默认编码方式,很可能解析错误
          if r.encoding=="ISO-8859-1":
                    # 将网页内容编码方式修改成从内容分析出的编码方式
                    r.encoding=r.apparent_encoding
          # 获取网页的HTML源代码
          demo=r.text
          
###### 新学习的内容 ######
          # 使用HTML解析器对源代码进行解析
          soup=BeautifulSoup(demo,"html.parser")
          # 显示网页的title标签内容
          print(soup.title)
##########################

# 检测到异常后执行的语句
except:
          print("网页访问失败!")

HTML文档的遍历

HTML文档对应一棵唯一的标签树,因此对HTML文档的遍历也就是对标签树的遍历。共有下行遍历、上行遍历和平行遍历三种方法。

下行遍历:从根节点向叶子节点遍历。

  • contents:获取一个标签的子标签的列表。
  • children:获取一个标签的子标签,是contents的迭代烈性,用于for…in结构循环遍历子标签。
  • descendants:子孙标签的迭代类型,包含所有的子孙标签,用于for…in方式循环遍历。

备注:标签包括标签名和一对标签名中间的内容,而非只是标签名。

上行遍历:从叶子节点向根节点遍历。

  • parent:获取当前标签的父标签。
  • parents:获取当前标签的所有先辈标签,属于迭代类型,用于for…in结构的循环遍历。

平行遍历:同一层次节点间的遍历。

  • next_sibling:按照HTML文本顺序的下一个平行标签。
  • previous_sibling:按照HTML文本顺序的上一个平行标签。
  • next_siblings:迭代类型,用于for…in结构按照HTML文本顺序遍历后续所有平行标签。
  • previous_siblings:迭代类型,用于for…in结构按照HTML文本顺序遍历之前所有平行标签。

备注:只有父标签相同的标签才能进行平行遍历。

prettify()方法

方法概述:在HTML文件中合适的位置插入换行符,使得在展示HTML文件内容时更加方便阅读和程序处理。

备注:prettify方法也可以用于处理单个标签。

测试用例

# 首先需要导入requests库和BeautifulSoup类
import requests
from bs4 import BeautifulSoup
# 使用get方法爬取测试网站的内容
r=requests.get("https://www.baidu.com/")
# 对可能抛出异常的部分放入try块中
try:
          # 检测Response对象的状态码,判断是否抛出异常
          r.raise_for_status()
          # 如果header中不存在charset字段,则encoding采用默认编码方式,很可能解析错误
          if r.encoding=="ISO-8859-1":
                    # 将网页内容编码方式修改成从内容分析出的编码方式
                    r.encoding=r.apparent_encoding
          # 获取网页的HTML源代码
          demo=r.text
          
###### 新学习的内容 ######
          # 使用HTML解析器对源代码进行解析
          soup=BeautifulSoup(demo,"html.parser")
          # 直接显示HTML源代码
          print(soup)
          # 对HTML源代码使用prettify方法处理并输出处理完的效果
          print(soup.prettify())
##########################

# 检测到异常后执行的语句
except:
          print("网页访问失败!")

处理前后效果对比

  • 处理前
    在这里插入图片描述
  • 处理后
    在这里插入图片描述

使用BeautifulSoup库对HTML文件进行内容查找

信息的标记的相关概念(非重点)

信息标记的好处

  • 标记后的信息可以形成信息的组织结构,增加了信息的维度。
  • 标记后的信息可以用于通信、存储或展示。
  • 标记后的结构和信息一样具有重要价值。
  • 标记后的信息有利于程序的理解和应用。

HTML简介:超文本标记语言。HTML是WWW的信息主要组织形式,能够将各种超文本信息嵌入到文本中。HTML通过标签组织不同类型的信息。

信息标记的三种形式

XML

  • 基本概念:扩展标记语言,是一种与HTML很接近的标记语言,采用以标签为主来构建和表达信息的方式。
  • 特点:最早的通用信息标记语言,可扩展性好,但是较为繁琐。
  • 举例:(参考北京理工大学慕课)
    在这里插入图片描述

JSON

  • 基本概念:由有类型的键值对构成的信息表达格式。
  • 特点:信息有类型,文本信息比例最高,比XML更加简洁。
  • 举例:(参考北京理工大学慕课)
    在这里插入图片描述

YAML

  • 基本概念:采用无类型的键值对构成的信息表大格式,通过缩进来表示所属关系。
  • 特点:信息无类型,文本信息比例最高,可读性好。
  • 举例:(参考北京理工大学慕课)
    在这里插入图片描述

信息提取的一般方法

  • 完整解析信息的标记形式,再提取关键信息。需要标记解析器,如bs4库对标签树的遍历。特点是信息解析准确,但是提取过程繁琐且速度很慢。
  • 无视标记形式,直接搜索关键信息,对信息的文本进行查找即可。特点是提取过程简洁且速度较快,但是提取结果的准确性和信息内容相关。
  • 融合方法:结合形式解析和搜索方法来提取相关信息,这是实际使用中最好的方法。

find_all()方法(重点)

基本语法find_all(name,attr,recursive,string)

返回值:返回一个包含满足条件的标签的集合,集合中的每一个元素是一个标签。

  • name:对标签的名称进行检索的字符串。如果需要同时查找多个标签名,可以传入一个列表。
  • attrs:对标签属性值的检索字符串,可以标注属性检索。用于查找带有某个指定名称属性的指定名称的标签。
  • recursive:布尔类型。当为True时表示查找当前标签的所有子孙标签;当为False时表示仅查找当前标签的同一层标签。
  • string:对一对标签之间的字符串进行检索。

备注:find_all方法的基本语法都只支持精确查找,例如与查找目标相差一个字符,或包含查找目标的情况都无法查找成功,需要借助正则表达式库。

查找某个指定属性为指定值的语法find_all(属性名=属性值)

备注:此时find_all方法不能再添加attr参数。

综合实例:爬取软科2022中国大学排名

# 进行网站爬取首先需要导入requests库
import requests
# 对网页的HTML内容进行解析需要用到bs4库
import bs4
# 需要使用到bs4库中的BeautifulSoup类对象
from bs4 import BeautifulSoup

# 设置所爬取的软科大学排名网站的URL
URL="https://www.shanghairanking.cn/rankings/bcur/2022"
# 使用request库的get方法爬取该URL对应的网络资源
r=requests.get(URL,timeout=20)
# 网络资源爬取可能失败抛出异常,因此需要考虑异常处理
try:
          # 如果资源爬取异常,则产生一个HTTP异常类对象抛出
          r.raise_for_status()
          # 判断网站是否被认为采用默认编码,如果是的话则修改编码方式
          if r.encoding=="ISO-8859-1":
                    r.encoding=r.apparent_encoding
          # 获取所爬取的网络资源文本
          text=r.text

          # 使用BeautifulSoup对象对网络资源文本进行HTML格式的解析
          HTML=BeautifulSoup(text,"html.parser")
          # 设置一个空的列表用于存储结果
          results=[]
          # 由于所有需要的信息都在body标签中,因此首先截取body标签中的内容
          body=HTML.find_all("body")[0]
          # 找出body标签中的标签名为tr的子标签,基本每个子标签对应一所大学的信息(第一个标签除外)
          trs=body.find_all("tr")
          # 通过遍历的方式逐一提取信息
          UniversityMaxNumber=len(trs)
          for i in range(1,UniversityMaxNumber):
                    # 从每一个tr标签中寻找名字为td的子标签的第一项并记录其内容(大学排名)
                    Rank=trs[i].find_all("td")[0].string.strip()
                    # 从每一个tr标签中寻找名字为a的子标签的第一项并记录其内容(大学名称)
                    University=trs[i].find_all("a")[0].string.strip()
          # 将大学排名和大学名称组合成一个子列表,插入到结果列表中
                    results.append([Rank,University])
          # 输出大学名称和相应的排名
          for i in results:
                    print(i)

# 网络资源爬取失败输出提示信息
except:
          print("网站内容爬取失败!")

运行效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

L2-037 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&#x…

SegPGD

在这项工作中&#xff0c;我们提出了一种有效和高效的分割攻击方法&#xff0c;称为SegPGD。此外&#xff0c;我们还提供了收敛性分析&#xff0c;表明在相同次数的攻击迭代下&#xff0c;所提出的SegPGD可以创建比PGD更有效的对抗示例。此外&#xff0c;我们建议应用我们的Seg…

【STM32笔记】晶振及旁路电容设计避坑(低速外部晶振LSE无法起振的可能原因)

【STM32笔记】晶振及旁路电容设计避坑&#xff08;低功耗低速外部晶振LSE无法起振的可能原因&#xff09; 晶振无法起振 无非就是旁路电容设计的有问题 一般旁路电容选10pF 12pF 20pF等等 都没啥问题 尤其是高速晶振 基本不会出问题 但是对于低速晶振 电容没选对 就很可能不起…

17- 梯度提升回归树GBRT (集成算法) (算法)

梯度提升回归树: 梯度提升回归树是区别于随机森林的另一种集成方法&#xff0c;它的特点在于纠正与加强&#xff0c;通过合并多个决策树来构建一个更为强大的模型。该模型即可以用于分类问题&#xff0c;也可以用于回归问题中。在该模型中&#xff0c;有三个重要参数分别为 n_…

海盗峡湾——NFT 作品集来袭!

陌生人们&#xff0c;通过这个作品集&#xff0c;可以让你沉浸在海盗们的文化和魔法中。这可能是你唯一的机会&#xff0c;用这些资产把你的土地变成海盗王国&#xff0c;所以不要犹豫了&#xff01; 这个由 Alina Siniakova 制作的系列于 2 月 3 日晚上 11 点在 The Sandbox 市…

倒带ChunJun,同心前行|2022年度回顾2023年共建规划

ChunJun是一个开始于2018年的批流一体数据集成框架项目&#xff0c;原名FlinkX。2022年2月22日&#xff0c;在FlinkX进行初版开源的整整四年后&#xff0c;技术团队决定对FlinkX进行整体升级&#xff0c;并更名为ChunJun&#xff0c;希望为大家真正提供一个稳定、高效、易用的批…

服务器常见的网络攻击以及防御方法

网络安全威胁类别 网络内部的威胁&#xff0c;网络的滥用&#xff0c;没有安全意识的员工&#xff0c;黑客&#xff0c;骇客。 木马攻击原理 C/S 架构&#xff0c;服务器端被植入目标主机&#xff0c;服务器端通过反弹连接和客户端连接。从而客户端对其进行控制。 病毒 一…

蓝桥杯C/C++VIP试题每日一练之报时助手

💛作者主页:静Yu 🧡简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者 💛社区地址:前端知识交流社区 🧡博主的个人博客:静Yu的个人博客 🧡博主的个人笔记本:前端面试题 个人笔记本只记录前端领域的面试题目,项目总结,面试技…

Nacos——Nacos简介以及Nacos Server安装

资料来源&#xff1a;02-Nacos配置管理-什么是配置中心_哔哩哔哩_bilibili nacos记得下载2.x版本的&#xff0c;负责以后新建配置的时候会出现“发布错误&#xff0c;请检查参数是否正确”错误&#xff01;&#xff01;&#xff01;&#xff01; 目录 一、Nacos简介 1.1 四…

【CS224W】(task4)图嵌入表示学习

note node2vec&#xff1a; 计算随机游走概率从节点uuu开始模拟rrr条长度为lll的游走链路使用 Stochastic Gradient Descent 优化损失函数 Node2vec在节点分类方面表现更好&#xff1b;而其他方法在链路预测上效果更好&#xff0c;如random walk效率更高&#xff1b;graph emb…

请注意,PDF正在传播恶意软件

据Bleeping Computer消息&#xff0c;安全研究人员发现了一种新型的恶意软件传播活动&#xff0c;攻击者通过使用PDF附件夹带恶意的Word文档&#xff0c;从而使用户感染恶意软件。 类似的恶意软件传播方式在以往可不多见。在大多数人的印象中&#xff0c;电子邮件是夹带加载了恶…

Redis-简单动态字符串

Redis中字符串应该是我们使用最多的一种数据类型了&#xff0c;但是有没有想过Redis是如何存储字符串的呢&#xff1f;Redis并没有用C语言传统的字符串(C语言中的字符串一般末尾采用空字符结尾&#xff0c;\0)&#xff0c;而是采用它们自己实现的一种简单动态字符串(SDS)实现的…

若依ruoyi——手把手教你制作自己的管理系统【二、修改样式】

阿里图标一(&#xffe3;︶&#xffe3;*)) 图片白嫖一((*&#xffe3;3&#xffe3;)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 运行成功后&#xff1a; idea后台正常先挂着 我习惯用VScode操作 当然如果有两台机子 一个挂后台一个改前端就更好…

java中volatile与synchronized的区别,volatile为什么不能保证原子性

1.volatile与synchronized的区别 2.volatile为什么不能保证原子性 定义&#xff1a; 即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断&#xff0c;要么就都不执行。 原子性是拒绝多线程操作的&#xff0c;不论是多核还是单核&#xff0c;具有原子性的量…

【C/C++】VS2019下C++生成DLL并且成功调用(金针菇般细)

目录 一&#xff0c;生成动态链接库 二&#xff0c;使用动态链接库 一&#xff0c;生成动态链接库 1.打开VS2019&#xff0c;创建新项目&#xff0c;选择 动态链接库(DLL) 模板后进行下一步 2.输入项目名称&#xff0c;其它默认就行(可自行选择)&#xff0c;点击创建 3 工程…

hive开窗函数

hive开窗函数 窗口函数 数据准备 1 jx 20 2 zx 24 3 yx 18 4 wz 10 5 yy 34 6 wy 25create table t (> id int,> name string,> age int> )> row format delimited fields terminated by ; load data inpath /data/data.txt into table t;ROW_NUMBER ROW_N…

网上订餐项目(含后台管理界面)

项目开发环境 项目使用IDEA 2018.3.5进行开发。Maven版本为 3.6.2。Tomcat版本为 8.5.42。数据库为mysql 5.7。JDK版本为1.8_211。项目使用SpringSpringMVCMybits框架。 点餐前台功能 登陆界面如下 登陆后可添加菜品到餐车 餐车里可查看添加的菜品 提交后可查看已派送和未…

Zookeeper配置化中心

zookeeper的基本知识 zookeeper的数据结构:zookeeper提供的命名空间非常类似于标准的文件系统&#xff0c;key-value的形式存储&#xff0c;名称key由/分割的一系列路径元素&#xff0c;zookeeper名称空间中的每个节点都是一个路径标志。 windows下的zookeeper安装&#…

使用Docker快速部署ES单机

所有的操作都是基于Docker来的&#xff0c;没有装Docker的话请参照官方文档安装单机环境部署初始化相关目录mkdir -p /usr/local/elasticsearch/{config,plugins,data}准备配置文件vim /usr/local/elasticsearch/config/elasticsearch.yml将下面的内容粘贴到elasticsearch.yml#…

训练一个中文gpt2模型

前言 这是我的github上的一个介绍&#xff0c;关于如何训练中文版本的gpt2的。链接为: https://github.com/yuanzhoulvpi2017/zero_nlp 介绍 本文&#xff0c;将介绍如何使用中文语料&#xff0c;训练一个gpt2可以使用你自己的数据训练&#xff0c;用来&#xff1a;写新闻、…