当前位置: 首页 > news >正文

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

文章目录

    • 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("网站内容爬取失败!")

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

相关文章:

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

文章目录BeautifulSoup库的基本介绍HTML标签的获取和相关属性HTML文档的遍历prettify()方法使用BeautifulSoup库对HTML文件进行内容查找信息的标记的相关概念&#xff08;非重点&#xff09;find_all()方法&#xff08;重点&#xff09;综合实例&#xff1a;爬取软科2022中国大…...

JavaScript------内建对象

一、解构赋值 1、数组的解构 1.1、解构赋值 const arr ["孙悟空", "猪八戒", "沙和尚"];let a, b, c;[a, b, c] arr; // 等同于 [a, b, c] ["孙悟空", "猪八戒", "沙和尚"] 1.2、声明同时解构 let [d, e…...

React + Redux 处理异步请求

redux 处理异步请求 方式一:在 componentDidmount 中直接进⾏请求,在将数据同步到 redux 创建 Store 仓库 import {createStore } from redux;const defaultState = {banners: [] }const reducer =...

揭秘涨薪50%经验:从功能测试到自动化测试,我是如何蜕变的?

本人在今年互联网大环境如此严峻的情况下&#xff0c;作为一个刚毕业不到一年的初级测试&#xff0c;赶在“金三银四”依然拿到了一些面试机会&#xff0c;并且成功拿下4家公司的offer&#xff0c;其中不乏互联网大厂&#xff0c;而且最高总包给到了接近double&#xff08;无炫…...

【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能

【论文速递】MMM2020 - 电子科技大学提出一种新颖的局部变换模块提升小样本分割泛化性能 【论文原文】&#xff1a;A New Local Transformation Module for Few-shot Segmentation 【作者信息】&#xff1a;Yuwei Yang, Fanman Meng, Hongliang Li, Qingbo Wu,Xiaolong Xu an…...

补充前端面试题(二)

#$set数据变化视图不更新问题, 当在项目中直接设置数组的某一项的值&#xff0c;或者直接设置对象的某个属性值&#xff0c;这个时候&#xff0c;你会发现页面并没有更新。这是因为 Object.defineProperty()限制&#xff0c;监听不到变化。解决方式&#xff1a;this.$set(你要改…...

JavaScript原型、原型链、原型方法

文章目录原型和原型链prototype、 __ proto __ 、constructor原型链原型方法instanceOfhasOwnPropertyObject.create()、new Object()总结原型和原型链 prototype、 __ proto __ 、constructor 首先我们看下面一段代码 // 构造函数Personfunction Person(name, age) {this.na…...

linux篇【14】:网络https协议

目录 一.HTTPS介绍 1.HTTPS 定义 2.HTTP与HTTPS &#xff08;1&#xff09;端口不同&#xff0c;是两套服务 &#xff08;2&#xff09;HTTP效率更高&#xff0c;HTTPS更安全 3.加密&#xff0c;解密&#xff0c;密钥 概念 4.为什么要加密&#xff1f; 5.常见的加密方式…...

1.9实验9:配置虚链路

1.4.4实验9:配置虚链路 实验目的(1) 实现OSPF 虚链路的配置 (2) 描述虚链路的作用 实验拓扑配置虚链路实验拓扑如图1-19所示。[1] 图1-19 配置虚链路 实验步骤...

三次握手-升级详解-注意问题

TCP建立连接的过程就是三次握手&#xff08;Three-way Handshake&#xff09;&#xff0c;在建立连接的过程实际上就是客户端和服务端之间总共发送三个数据包。进行三次握手主要是就是为了确认双方都能接收到数据包和发送数据包&#xff0c;而客户端和服务端都会指定自己的初始…...

软件架构知识3-系统复杂度-高可用性、可扩展性、低成本、安全、规模

高可用性 系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度&#xff0c;是进行系统设计时的准则之一。 高可用的“冗余”解决方案&#xff0c;单纯从形式上来看&#xff0c;和之前讲的高性能是一样的&#xff0c;都是通过增加更多机 器来达到目的&#xff0c;但…...

SpringCloud学习笔记 - 自定义及解耦降级处理方法 - Sentinel

1. SentinelRecourse配置回顾 通过之前的学习&#xff0c;我们知道SentinelRecourse配置的资源定位可以通过两种方式实现&#xff1a;一种是URL&#xff0c;另一种是资源名称。这两种限流方式都要求资源ID唯一 RestController public class RateLimitController {GetMapping(…...

Redis之搭建一主多从

搭建redis一主多从的过程 1.在相应位置创建一个文件夹存放redis配置文件 mkdir myredis2.复制redis配置文件到此文件夹中 cp /opt/redis/redis/bin/redis.conf /opt/myredis/redis.conf3.新建三个配置文件 touch redis6379.conf touch redis6380.conf touch redis6381.conf4…...

Transformer机制学习笔记

学习自https://www.bilibili.com/video/BV1J441137V6 RNN&#xff0c;CNN网络的缺点 难以平行化处理&#xff0c;比如我们要算b4b^4b4&#xff0c;我们需要一次将a1a^1a1~a4a^4a4依次进行放入网络中进行计算。 于是有人提出用CNN代替RNN 三角形表示输入&#xff0c;b1b^1b1的…...

1、第一个CUDA代码:hello gpu

目录第一个CUDA代码&#xff1a;hello gpu一、__global__ void GPUFunction()二、gpu<<<1,1>>>();三、线程块、线程、网格知识四、核函数中的printf();五、cudaDeviceSynchronize();第一个CUDA代码&#xff1a;hello gpu #include <stdio.h>void cpu(…...

UG二次开发装配篇 添加/拖动/删除组件方法的实现

我们在UG装配的过程中&#xff0c;经常会遇到需要调整组件目录位置&#xff0c;在软件设计过程中可以通过在目录树里面拖动组件来完成。 那么&#xff0c;如果要用程序实现组件的移动/拖动&#xff0c;我们要怎么做呢&#xff1f; 本节就完成了添加/拖动/删除组件方法的实现&…...

【ros bag 包的设计原理、制作、用法汇总】

ros bag 包的设计原理 序列化和反序列化 首先知道Bag包就是为了录制消息,而消息的保存和读取就涉及到一个广义上的问题序列化和反序列化,它基本上无处不在,只是大部分人没有注意到,举个简单的例子,程序运行的时候,是直接操作的内存,也就是一个结构体或者一个对象,但内…...

Linux网络:聚合链路技术

目录 一、聚合链路技术 1、bonding作用 2、Bonding聚合链路工作模式 3、Bonding实现 一、聚合链路技术 1、bonding作用 将多块网卡绑定同一IP地址对外提供服务&#xff0c;可以实现高可用或者负载均衡。直接给两块网卡设置同一IP地址是不可以的。通过 bonding&#xff0c…...

2023年数据安全的下一步是什么?

IT 预算和收入增长领域是每个年度开始时的首要考虑因素&#xff0c;在当前的世界经济状况下更是如此。 IT 部门和数据团队正在寻找确定优先级、维护和构建安全措施的最佳方法&#xff0c;同时又具有成本效益。 这是一个棘手的平衡点&#xff0c;但却是一个重要的平衡点&#…...

在浏览器输入URL后发生了什么?

在浏览器输入URL并获取响应的过程&#xff0c;其实就是浏览器和该url对应的服务器的网络通信过程。从封装的角度来讲&#xff0c;浏览器和web服务器执行以下动作&#xff1a;&#xff08;简单流程&#xff09;1、浏览器先分析超链接中的URL:分析域名是否规范2、浏览器向DNS请求…...

Dubbo学习

0.start 容器container启动&#xff08;spring&#xff09;&#xff0c;初始化我们的服务提供者&#xff08;Provider&#xff09;1.register 把业务层的方法&#xff0c;注册到注册中心&#xff08;Register&#xff09;2.subscribe 消费者&#xff08;Consumer&#xff09;订…...

CMMI-立项管理流程

立项管理&#xff08;Project Initialization Management, PIM&#xff09;的目的是&#xff1a;&#xff08;1&#xff09;采纳符合机构最大利益的立项建议&#xff0c;通过立项管理使该建议成为正式的项目&#xff08;即合法化&#xff09;。&#xff08;2&#xff09;杜绝不…...

看《狂飙》读人生,致敬2023!

作为2023年的第一篇博文&#xff0c;我不想写代码&#xff0c;我想谈谈最近看的《狂飙》&#xff0c;总结了十条哲理&#xff0c;共勉。希望我们的2023&#xff0c;未来的人生会更加出彩。 01 你以为很好的关系&#xff0c;其实也就那么回事。 陈金默以为高启强对他很好&…...

Web自动化测试——Junit5篇

文章目录一、相关依赖注入二、注解调用三、断言 Assert四、规定用例执行顺序五、高效参数化1&#xff09;单参数2&#xff09;多参数3&#xff09;文件获取参数4&#xff09;方法获取数据&#xff08;动态参数&#xff09;六、测试套件整活Junit 是一个面向 Java 语言的单元测试…...

Seata源码学习(二)-源码入口

Seata源码剖析-源码入口 Seata客户端启动 首先一个Seata的客户端启动一般分为几个流程&#xff1a; 自动加载各种Bean及配置信息初始化TM初始化RM&#xff08;具体服务&#xff09;初始化分布式事务客户端完成&#xff0c;代理数据源连接TC&#xff08;Seata服务端&#xff…...

2023如何选购适合游戏设计的电脑硬件

游戏设计涉及许多不同的学科&#xff0c;因此涉及许多不同的软件包。有游戏引擎本身&#xff0c;例如 Unreal Engine 和 Unity&#xff0c;以及 3D 设计软件&#xff0c;例如 3ds Max、Blender 和 ZBrush——等等&#xff01;大多数软件开发人员都维护着这些不同应用程序的系统…...

springboot maven项目集成阿里p3c-pmd插件使用

阿里巴巴规约使用的是pmd代码静态分析工具&#xff0c;通过maven-pmd-plugin这个maven插件实现。 pom文件引入 <!-- 阿里p3c插件 --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId><…...

PowerJob的server启动都经历了哪些?代码不多也很简单,咱们来逐一理解。

这是一篇让你受益匪浅的文章&#xff0c;点个关注交流一下吧~ PowerJob如何使用&#xff0c;官方文档已经说的很详细了&#xff0c;即使没学过计算机的人&#xff0c;按照那上面的步骤来也是可以搭建出一个可以使用的例子来&#xff0c;所以今天就不在这里重复前人的工作&#…...

分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏

近年来&#xff0c;市面上一直流行各种h5游戏&#xff0c;例如投票、答题、刮刮乐、大转盘等等等等&#xff0c;而且我在各种营销场景下经常看到它们的身影&#xff0c;是做促销&#xff0c;引流和宣传的神器之一&#xff01;那么&#xff0c;怎么做好玩的h5游戏&#xff1f;还…...

代理模式--设计模式

为什么要学习代理模式&#xff1f; 因为这是SpringAOP的底层&#xff01; 1、定义&#xff1a; 在不改变源码的情况下&#xff0c;实现对目标对象的功能扩展 根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种 静态代理 角色分析 抽象角色&#xff1a;一般会…...

北京智能网站建设制作/广州seo代理

上一篇我们主要学习了一维数组的操作&#xff0c;现实场景中&#xff0c;一维数组往往无法满足需要&#xff0c;本关将学习略微复杂的多维数组。多维数组一维数组只有行&#xff0c;二维数组相比一维数组多了列这个维度&#xff0c;而三维数组则类似多个二维数组堆叠在一起&…...

怎么做根优酷差不多的网站/视频广告

一般编程题&#xff0c;稍加思考可以推出&#xff1a; (1) 从任意一个位置开始&#xff0c;如果能坐上所有位置&#xff0c;则从其他位置开始同样可以 (2) 1的否命题也成立 指定从 \((0, 0)\) 开始&#xff0c;编程模拟坐的过程即可判断Possible还是Impossible。 【优化】 \(m\…...

wordpress主题 卡通/360站长平台

会员制早已渗透进我们的生活中&#xff0c;成为当下许多企业开启新增长模式的金钥匙。会员系统是私域流量的载体和工具&#xff0c;私域流量是概念&#xff0c;要想落地实操还是得靠会员体系&#xff0c;并且这套系统是已经运行了很长时间被验证真实可靠的系统。 近年流量红利…...

视频网站做app还是h5/宁波seo网络推广代理公司

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知。⛄ 内容介绍构建直线阵列,圆阵列和平面阵列天线的数学模…...

网站建设套餐服务/动态网站的制作与设计

2019独角兽企业重金招聘Python工程师标准>>> 这篇文章只是按照自己的需要去配置代码生成器&#xff0c;未对所有配置进行讲解&#xff0c;需要了解具体详情的&#xff0c;请到官网查阅文档。点击传送 1、首先引入相关的依赖&#xff0c;为了操作方便&#xff0c;也引…...

现在网站都是拿什么软件做的/seo的搜索排名影响因素有哪些

2019独角兽企业重金招聘Python工程师标准>>> 要在网页做一个类似windows“我的电脑”那种文件夹文件的展示&#xff0c;并且能上传下载删除重命名等功能。 &#xff08;一&#xff09;找JS插件&#xff0c;读取文件夹内容&#xff0c;利用插件展示 1.看到几个“推荐…...