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

news2025/2/24 8:19:51
        在使用 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>

 

 

 

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

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

相关文章

数据结构-期末复习题

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

拼多多滑块逆向

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言(lianxi …

onInterceptTouchEvent() 与 onTouch() 事件分析

前言 本文主要分析 onTouch() 与 onTouchEvent() 事件的差异 正文 先看布局文件&#xff1a; <?xml version"1.0" encoding"utf-8"?> <com.longzhiye.intercepttouch.MyFrameLayout xmlns:android"http://schemas.android.com/apk/res…

Big Data Tools插件

一些介绍 在Jetbrains的产品中&#xff0c;均可以安装插件&#xff0c;其中&#xff1a;Big Data Tools插件可以帮助我们方便的操作HDFS&#xff0c;比如 IntelliJ IDEA&#xff08;Java IDE&#xff09; PyCharm&#xff08;Python IDE&#xff09; DataGrip&#xff08;SQL …

ctfshow-web入门-命令执行(web71-web74)

目录 1、web71 2、web72 3、web73 4、web74 1、web71 像上一题那样扫描但是输出全是问号 查看提示&#xff1a;我们可以结合 exit() 函数执行php代码让后面的匹配缓冲区不执行直接退出。 payload&#xff1a; cvar_export(scandir(/));exit(); 同理读取 flag.txt cinclud…

mybatis实现动态sql

第一章、动态SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验&#xff0c;你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特…

网安小贴士(2)OSI七层模型

一、前言 OSI七层模型是一种网络协议参考模型&#xff0c;用于描述计算机网络体系结构中的不同层次和功能。它由国际标准化组织 (ISO) 在1984年开发并发布。 二、定义 OSI七层模型&#xff0c;全称为开放式系统互联通信参考模型&#xff08;Open Systems Interconnection Refe…

微型导轨:手术机器人的高精度“骨骼”

微型导轨精度高&#xff0c;摩擦系数小&#xff0c;自重轻&#xff0c;结构紧凑&#xff0c;被广泛应用在医疗器械中&#xff0c;尤其是在手术机器人中的应用&#xff0c;通过手术机器人&#xff0c;外科医生可以远离手术台操纵机器人进行手术。可以说&#xff0c;是当之无愧的…

6-linux操作文件与数据上传

目录 通配符学习 创建和上传下载文件 系统盘与数据盘 创建和查找文件夹 文件上传与移动 Windows上传文件到服务器方法1 Windows上传文件到服务器方法2&#xff1a;网盘等 删除文件 rm 复制文件cp 移动文件 常用的命令 cp:复制文件和目录。 mv:移动或重命名文件和目…

「漏洞复现」时空智友ERP系统updater.uploadStudioFile 任意文件上传漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

九浅一深Jemalloc5.3.0 -- ①浅*编译调试

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。5.3.0的特性请见Releases jemalloc/jemalloc GitHub 另…

Chrome备份数据

Chrome备份数据 1、 导出谷歌浏览器里的历史记录 参考&#xff1a;https://blog.csdn.net/qq_32824605/article/details/127504219 在资源管理器中找到History文件&#xff0c;文件路径&#xff1a; C:\Users\你的电脑用户名\AppData\Local\Google\Chrome\User Data\Default …

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 15 题,每题 2 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

前端工程化09-webpack静态的模块化打包工具(未完结)

9.1、开发模式的进化历史 webpacks是一个非常非常的强大的一个工具&#xff0c;相应的这个东西的学习也是有一定的难度的&#xff0c;里边的东西非常的多&#xff0c;里面涉及到的 概念的话也是非常非常的多的。 这个东西既然非常重要&#xff0c;那么在我们前端到底处于怎样…

如何在面试中找到最优秀的候选人:雇佣问题的随机化算法探索

目录 一、雇佣问题 二、雇佣问题的本质 三、引入随机化算法的思考过程 &#xff08;一&#xff09;随机排列 &#xff08;二&#xff09;预面试期 &#xff08;三&#xff09;正式雇佣期 四、概率分析 &#xff08;一&#xff09;预面试期的选择 &#xff08;二&#…

昇思25天学习打卡营第12天 | 基于MobileNetv2的垃圾分类函数式自动微分

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&a…

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

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

VUE3-Elementplus-form表单-笔记

1. 结构相关 el-row表示一行&#xff0c;一行分成24份 el-col表示列 (1) :span"12" 代表在一行中&#xff0c;占12份 (50%) (2) :span"6" 表示在一行中&#xff0c;占6份 (25%) (3) :offset"3" 代表在一行中&#xff0c;左侧margin份数 el…

实验5 图像分割

1. 实验目的 ①掌握图像分割的含义与目的&#xff1b; ②掌握迭代法、最大类间方差法、直方图法等阈值分割方法&#xff1b; ③掌握霍夫变换、区域生长法、区域分裂与合并法的原理&#xff0c;并能编程实现。 2. 实验内容 ①调用Matlab / PythonOpenCV中的相关函数&#xff…

【数据库】PostgreSQL数据库设计说明书(编制参考)

数据库设计说明书要点应包含&#xff1a;项目概述、数据库选型、逻辑设计、物理设计、数据安全与性能。简述项目需求与背景&#xff0c;选择适当的数据库系统&#xff0c;明确数据表结构、关系及索引设计&#xff0c;描述存储过程、触发器等逻辑组件。同时&#xff0c;强调数据…