爬虫中如何创建Beautiful Soup 类的对象

        在使用 lxml 库解析网页数据时,每次都需要编写和测试 XPath 的路径表达式,显得非常
烦琐。为了解决这个问题, Python 还提供了 Beautiful Soup 库提取 HTML 文档或 XML 文档的
节点。 Beautiful Soup 使用起来很便捷,受到了开发人员的推崇。接下来,本节先带领大家认
Beautiful Soup ,再为大家介绍如何使用 Beautiful Soup 解析网页数据。

一、Beautiful Soup 简介

        Beautiful Soup 是一个用于从 HTML 文档或 XML 文档中提取目标数据的 Python 库。它历
经了众多版本,其中 Beautiful Soup 3 已经停止开发与维护,官方推荐使用 Beautiful Soup 4 (简
bs4 )进行程序开发。截至本书完稿时, Beautiful Soup 的最新版本是 4.4.0
        为了快速解析 HTML 文档或 XML 文档的数据, bs4 不仅提供了多种类型的解析器,还支
CSS 选择器。 bs4 通过解析器可以将 HTML XML 文档、片段转换成节点树,节点树中
的每个节点对应一个 Python 类的对象。 bs4 库或 bs4.element 模块中提供了 Tag 类、
NavigableString 类、 BeautifulSoup 类、 Comment 类等 4 个比较重要的类。关于这 4 个类的具
体介绍如下。
  •  bs4.element.Tag 类:表示 HTML XML 中的元素,是最基本的信息组织单元。它有 两个非常重要的属性:表示元素名称的 name 和表示元素属性的 attrs
  •  bs4.element.NavigableString 类:表示 HTML XML 元素中的文本(非属性字符串)。
  •  bs4.BeautifulSoup 类:表示 HTML XML 节点树中的全部内容,支持遍历节点树和 搜索节点树的大部分方法。
  •  bs4.element.Comment类:表示元素内字符串的注释部分,是一种特殊的NavigableString 类的对象。
        bs4 的用法非常简单,一般分为如下 3 个步骤。
1 )根据 HTML XML 文档、片段创建 BeautifulSoup 类的对象。
2 )通过 BeautifulSoup 类的对象的查找方法或 CSS 选择器定位节点。
3 )通过访问节点的属性或节点的名称提取文本。

二、创建 BeautifulSoup 类的对象

        要想使用 bs4 解析网页数据,需要先使用构造方法创建 BeautifulSoup 类的对象。
BeautifulSoup 类的构造方法的声明如下。
BeautifulSoup(markup="", features=None, builder=None, 
 parse_only=None, from_encoding=None, exclude_encodings=None, 
 element_classes=None, **kwargs)
        上述方法中常用参数的含义如下。
  •  markup:必选参数,表示待解析的内容,可以取值为字符串或类似文件的对象。
  • features:可选参数,表示指定的解析器。该参数可以接收解析器名称或标记类型。其 中,解析器名称包括 lxmllxml-xmlhtml.parser html5lib,标记类型包括 htmlhtml5 xml
  • parse_only:可选参数,指定只解析部分文档。该参数需要接收一个 SoupStrainer 类的 对象。当文档太大而无法全部放入内存时,便可以考虑只解析一部分文档。
  • from_encoding:可选参数,指定待解析文档的编码格式。 值得一提的是,如果我们只需要解析 HTML 文档,那么在创建 BeautifulSoup 类的对象时 可以不用指定解析器。此时 Beautiful Soup 会根据当前系统安装的库自动选择解析器。解析器 的选择顺序为 lxmlhtml5libPython 标准库,但在以下两种情况下会发生变化。
  • 要解析的文档是什么类型?目前支持 htmlxml html5
  • 指定使用哪种解析器?目前支持 lxmlhtml5lib html.parser
        如果指定的解析器没有安装,那么 Beautiful Soup 会自动选择其他方案。不过,目前只有
解析器 lxml 支持 XML 文档的解析。在当前系统中没有安装解析器 lxml 的情况下,即使创建
BeautifulSoup 对象时明确指定使用解析器 lxml ,也无法得到解析后的内容。
下面通过一张表来区分上述 4 种解析器的优势与劣势,具体如表 4-7 所示。

         接下来,通过一个例子来演示如何创建 BeautifulSoup 类的对象,具体代码如下。

1 from bs4 import BeautifulSoup 
2 html_doc = """<html><head><title>The Dormouse's story</title></head> 
3 <body> 
4 <p class="title"><b>The Dormouse's story</b></p> 
5 <p class="story">Once upon a time there were three little sisters; 
6 and their names were 
7 <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>, 
8 <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and 
9 <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; 
10 and they lived at the bottom of a well.</p> 
11 <p class="story">...</p> 
12 """ 
13 # 根据 html_doc 创建 BeautifulSoup 类的对象,并指定使用 lxml 解析器解析文档
14 soup = BeautifulSoup(html_doc, features='lxml') 
15 print(soup.prettify())
        在上述示例代码中,第 1 行代码导入了 BeautifulSoup 类,第 2 12 行定义了变量 html_doc
保存 HTML 代码片段,第 14 行代码根据 html_doc 创建了一个 BeautifulSoup 类的对象,并指
定使用解析器 lxml 来解析 HTML 文档,第 15 行代码输出了 soup.prettify() 执行的结果,其中
prettify() 方法会对 HTML 代码片段进行格式化处理,友好地显示 HTML 代码。
运行代码,输出如下结果。
<html> 
 <head> 
 <title> 
 The Dormouse's story 
 </title> 
 </head> 
 <body> 
 <p class="title"> 
 <b> 
 The Dormouse's story 
 </b> 
 </p> 
 ……
 </body> 
</html>

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件&#xff0c;让…

使用世界变换的逆转置矩阵对法线进行变换

法向量变换细节记录 最近在做法向量变换的时候&#xff0c;踩了两个坑&#xff0c;记录一下相关的知识点 法向量做变换&#xff0c;最后一位是补0 我们知道&#xff0c;顶点在做变换的时候最后一位是 1.0&#xff0c;法线最后一位是补0.0 vec3 normCurrent (getMatrixWorld() …

【NodeJs】入门

目录 一、前导 二、 url模块 三、path模块 四、buffer模块 五、fs模块 六、stream流模块 七、os模块 八、crypto模块 九、util模块 十、http模块 nodejs官网 Node.js — 在任何地方运行 JavaScript nmp是Node.js包管理器&#xff0c;用来安装各种库、框架和工具&…

基于STM32的八位数码管显示和闹钟计时【Proteus仿真】

某鱼&#xff1a;两栖电子 一、系统功能 采用矩阵键盘&#xff0c;按下对应的数字再按下确认按键&#xff0c;数码管会显示自己输入的数字&#xff0c;如果按错可以使用删除按钮进行删除。点击计时按钮可以显示当前的时间。 二、使用器件 DS1302实时时钟芯片&#xff0c;8位数…

Mac虚拟机软件有什么用?

随着苹果M系列芯片电脑的推出&#xff0c;虚拟机的使用变得越来越流行。不同于苹果以往的Intel处理器电脑&#xff0c;其M系列芯片电脑无法安装双系统。如果要使用非macOS系统&#xff0c;可以通过创建虚拟机系统的方式实现。那么&#xff0c;虚拟机软件有什么作用和用途&#…

DP(动态规划)【3】 最长公共子序列 最长回文子串

目录 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 又是这个问题&#xff1a;如何读入字符串 2.最长回文子串 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 这里dp[i][j]是说S的前i位与T的前j位公共序列&#xff…

韩顺平0基础学java——第34天

p675-689 UDP网络编程 1.类 DatagramSocket和 DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序。 2.UDP数据报通过数据报套接字DatagramSocket发送和接收&#xff0c;系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。 3.DatagramPacket对象…

FastAPI教程III

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 这部分暂无需求的没有记录&#xff0c;仅放置标题。 依赖项 安全性 中间件 你可以向FastAPI应用添加中间件。 ”中间件“是一个函数&#xff0c;它在每个请求被特定的路径操作处理之前&#xff0c;以及在每个…

植物大战僵尸融合版最新版2024蓝飘飘fly

亲爱的花园守护者们&#xff0c;是否已经厌倦了传统塔防游戏的老套模式&#xff1f;是否渴望在熟悉的《植物大战僵尸》中寻找全新的刺激体验&#xff1f;那么&#xff0c;让我们一起走进《植物大战僵尸融合版》的异想世界&#xff0c;开启一场别开生面的园艺之战吧&#xff01;…

区间动态规划——最长回文子序列长度(C++)

把夜熬成粥&#xff0c;然后喝了它。 ——2024年7月1日 书接上回&#xff1a;区间动态规划——最长回文子串&#xff08;C&#xff09;-CSDN博客&#xff0c;大家有想到解决办法吗&#xff1f; 题目描述 给定一个字符串s&#xff08;s仅由数字和英文大小写字母组成&#xff0…

以太网交换机原理

没有配置&#xff0c;比较枯燥&#xff0c;二可以认识线缆&#xff0c; 三比较重要&#xff0c;慢慢理解&#xff0c;事半功倍。 各位老少爷们&#xff0c;在下给大家说段以太网交换机原理&#xff0c;说得不好大家多多包涵&#xff0c;说得好呢&#xff0c;大家叫个好&#x…

Debugging using Visual Studio Code

One of the key features of Visual Studio Code is its great debugging support. VS Code’s built-in debugger helps accelerate your edit, compile, and debug loop. Debugger extensions VS Code 内置了对 Node.js 运行时的调试支持,可以调试 JavaScript、TypeScript…

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而&#xff0c;这种快速增长也吸引了恶意行为者的注意&#xff0c;他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上&#xff0c;但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection

LW-DETR: A Transformer Replacement to YOLO for Real-Time Detection 论文链接&#xff1a;http://arxiv.org/abs/2406.03459 代码链接&#xff1a;https://github.com/Atten4Vis/LW-DETR 一、摘要 介绍了一种轻量级检测变换器LWDETR&#xff0c;它在实时物体检测方面超越…

matrixone集群搭建、启停、高可用扩缩容和连接数据库

1. 部署 Kubernetes 集群 由于 MatrixOne 的分布式部署依赖于 Kubernetes 集群&#xff0c;因此我们需要一个 Kubernetes 集群。本篇文章将指导你通过使用 Kuboard-Spray 的方式搭建一个 Kubernetes 集群。 准备集群环境 对于集群环境&#xff0c;需要做如下准备&#xff1a…

数据结构-期末复习题

数据结构-期末复习题 一、选择题 1、在数据结构中&#xff0c;与所使用的计算机无关的是数据的&#xff08; ) 结构。 A. 存储B. 物理C. 逻辑D. 物理和存储 【答案】C 【解析】暂无解析2、算法分析的两个主要方面是 ( )。 A. 正确性和简单性B. 可读性和文档性C. 空间复杂度…

测评推荐:企业管理u盘的软件有哪些?

U盘作为一种便携的存储设备&#xff0c;方便易用&#xff0c;被广泛应用于企业办公、个人学习及日常工作中。然而&#xff0c;U盘的使用也带来了数据泄露、病毒传播等安全隐患。为了解决这些问题&#xff0c;企业管理U盘的软件应运而生。 本文将对市面上流行的几款U盘管理软件…

【SQLmap】常用命令

文章目录 实际使用案例常用命令基本命令数据库指纹识别用户信息用户权限数据库枚举数据导出密码哈希操作系统命令执行文件操作代理和网络参数指定保存恢复自动搜索注入智能模式等级设置自动注入WAF 绕过杂项帮助和支持 SQLmap 是一款开源的自动化 SQL 注入检测和利用工具&#…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句&#xff0c;从而获取、修改或删除数据库中的数据。 具体细节如下&#xff1a; 攻击向量&…

【Spring Boot】Java 持久层 API:JPA

Java 持久层 API&#xff1a;JPA 1.Spring Data1.1 主要模块1.2 社区模块 2.JPA3.使用 JPA3.1 添加 JPA 和 MySQL 数据库的依赖3.2 配置数据库连接信息 4.了解 JPA 注解和属性4.1 常用注解4.2 映射关系的注解4.3 映射关系的属性 5.用 JPA 构建实体数据表 1.Spring Data Spring…