BeautifulSoup 库的使用——python爬虫

news2025/4/24 5:50:42

文章目录

  • 写在前面
  • python 爬虫
    • BeautifulSoup库是什么
    • BeautifulSoup的安装
    • 解析器对比
    • BeautifulSoup的使用
      • BeautifulSoup 库中的4种类
      • 获取标签
        • 获取指定标签
        • 获取标签的的子标签
        • 获取标签的的父标签(上行遍历)
        • 获取标签的兄弟标签(平行遍历)
        • 获取注释
        • 根据条件查找标签
        • 根据CSS选择器查找标签

写在前面

本文主要介绍了python爬虫中的BeautifulSoup库的安装和使用,如果是爬虫小白,请先看文章爬虫入门与requests库的使用,再来看本文章,这样你会有更深刻地理解,当然,大佬随意。

python 爬虫

BeautifulSoup库是什么

BeautifulSoup是一个用于解析 HTMLXML 文档的 Python 库,它帮助你从网页中提取数据。这个库非常灵活,并且可以与多种不同的解析器一起工作,比如 Python 内置的 html.parserlxml 或者 html5lib

BeautifulSoup的安装

想要安装BeautifulSoup库,则需要执行以下安装命令:

  • pip install bs4
  • pip install beautifulsoup4
  • pip install soupsieve
  • pip install lxml

解析器对比

在这里插入图片描述

如上图,其中markup为一个html文件或者html代码(字符串形式)。

BeautifulSoup的使用

BeautifulSoup 库中的4种类

BeautifulSoup 将复杂的 HTML 文档转换成由 Python 对象构成的树形结构,主要包括以下四种类型的对象:Tag, NavigableString, BeautifulSoup, 和 Comment

  • Tag:表示标签。
  • NavigableString:表示标签之间的文本内容。
  • BeautifulSoup:表示整个解析后的文档。
  • Comment:一种特殊的 NavigableString,表示 HTML 中标签之间的注释。

获取标签

获取指定标签

Tag(获取标签):

from bs4 import BeautifulSoup

with open(file="test.html", mode='r', encoding='utf-8') as fp:

    soup = BeautifulSoup(markup=fp, features='html.parser')
    # 解析html文件并将解析结果返回
    
    # 查找并获取HTML文档中的第一个 <h2> 标签。
    h2_tag = soup.h2
    
    
    # 打印找到的 <h2> 标签(如果有的话)。如果没有找到 <h2> 标签,则打印None。
    print(h2_tag)
    
    
    # 打印 <h2> 标签的数据类型。如果是有效的标签,它将是bs4.element.Tag 类型;
    #如果没有找到标签,则是NoneType。
    print(type(h2_tag))
    
    # 打印标签名 
    print(h2_tag.name) 
    
    # 修改标签名后打印,并不会修改原HTML文档中的标签名 
    h2_tag.name = 'h3' 
    
    
    print(h2_tag.name)
    
    
    # 获取标签之间的文本内容(纯文本内容),如果标签中还有标签,则返回None 
    print(h1_tag.string) 
    
    # 获取标签之间的文本内容,如果标签中还有标签,
    #则获取所有二级标签的内容(以换行分隔)
    # 最终将所有的文本内容拼接成一个字符串返回
    print(h1_tag.get_text())
    

    img_tag = soup.img    #获取到第一个<img>标签
    
    
    # 以字典方式获取标签的所有属性的键和值
    print(img_tag.attrs)
    
   
    
    # 获取img标签中属性alt的值,如果属性不存在报KeyError错误
    print(img_tag['alt'])
    
    # 获取img标签中属性alt的值,如果属性不存在返回None
    print(img_tag.get('alt'))
    print(img_tag.attrs.get('alt'))
    # 以上两种方式是同样的效果
    
    
    img_tag['alt'] = '修改后的alt'
    # 打印修改后的alt的值
    print(img_tag['alt'])
    
    
    # 删除属性
    del img_tag['alt']
    
    # 打印标签内容
    print(img_tag)

下面详细地讲解一下需要注意的方法:

标签名.get_text():

# 获取标签之间的文本内容,如果标签中还有标签,
# 则获取所有二级标签的文本内容(以换行分隔)
# 最终将所有的文本内容拼接成一个字符串返回
 print(h1_tag.get_text())

<div>
  <p>Hello</p>
  <span>World</span>
</div>
div_tag.get_text()          # 输出: '\nHello\nWorld\n'
div_tag.get_text(strip=True) # 输出: 'HelloWorld'
div_tag.get_text(separator=" | ") # 输出: '\n | Hello | \n | World | \n'
获取标签的的子标签
  1. 获取指定标签的所有子节点标签及文本内容(列表形式返回)

标签名.contents:

标签名.contents

#获取当前标签的直接子节点列表(不含子孙)
<div>
  <p>Hello</p>
  <span>World</span>
</div>
div_tag.contents 
# 输出: ['\n', <p>Hello</p>, '\n', <span>World</span>, '\n']

在这里插入图片描述

注意:与上面的标签名.get_text()作区别

  1. 获取指定标签的所有子节点标签及文本内容(迭代器形式返回)
soup.标签名.children
#获得标签对应的子标签和子字符串(回车)的迭代类型,可以直接用于迭代

  1. 获取指定标签的所有子孙后代节点标签及文本内容(迭代器形式返回)
soup.标签名.descendants
# 获得标签对应的所有的子孙标签和子孙字符串的迭代类型,可以直接用于迭代
获取标签的的父标签(上行遍历)
  1. 获取指定标签的父标签(迭代器形式返回)
soup.标签名.parent
#获得标签对应的父标签

  1. 获取指定标签的所有先辈标签(迭代器形式返回),从直接父级开始,逐级向上到文档根节点
soup.标签名.parents
 #获得标签对应的先辈标签的迭代类型,可以直接用于迭代
获取标签的兄弟标签(平行遍历)
  1. 获取指定标签相邻的下一个平行标签(按html代码顺序)
soup.标签名.next_sibling  
#返回按html代码顺序的下一个平行节点标签
  1. 获取指定标签相邻的上一个平行标签(按html代码顺序)
soup.标签名.previous_sibling
# 返回html代码顺序的上一个平行节点标签
  1. 获取指定标签后续的所有平行标签(即按html代码顺序排在指定标签后的所有兄弟标签)
soup.标签名.next_siblings
# 返回html代码顺序的后续所有平行节点标签
  1. 获取指定标签前序的所有平行标签(即按html代码顺序排在指定标签前的所有兄弟标签)
soup.标签名.previous_siblings 
#返回html代码顺序的前序所有平行节点标签
获取注释

想要获取和操作html文件或代码中的注释,需要通过 BeautifulSoupComment 类。

Comment类的作用;

  • 提取注释内容:从 HTML/XML 中提取被 <!-- ... --> 包裹的注释文本。
  • 判断节点类型:识别某个字符串节点是否为注释。

定位注释:

注释在 BeautifulSoup 中被解析为 Comment 类型的特殊字符串对象,可通过以下方式获取:

from bs4 import BeautifulSoup, Comment

html = '''
<div>
  <p>正文内容</p>
  <!-- 这是一个隐藏的注释 -->
</div>
'''

soup = BeautifulSoup(html, 'html.parser')

# 方法1:遍历所有字符串节点,筛选出注释
comments = soup.find_all(string=lambda text: isinstance(text, Comment))
for comment in comments:
    print("注释内容:", comment)  # 输出: 这是一个隐藏的注释

# 方法2:直接通过标签访问(若注释在标签内)
div_tag = soup.div
comment_in_div = div_tag.find(string=lambda text: isinstance(text, Comment))
print(comment_in_div)  # 输出: 这是一个隐藏的注释

操作注释:

  • 提取注释文本:直接获取 Comment 对象的字符串。
  • 替换或删除注释

# 找到对应的注释
# 替换注释为普通文本
comment = div_tag.find(string=lambda text: isinstance(text, Comment))
comment.replace_with("替换后的文本")

# 删除注释
comment.extract()

例子( 提取注释中的日期):

from bs4 import BeautifulSoup, Comment

html = '''
<div class="article">
  <!-- 文章发布时间:2023-10-01 -->
  <h1>标题</h1>
  <p>正文内容...</p>
</div>
'''

soup = BeautifulSoup(html, 'html.parser')
div_tag = soup.find('div', class_='article')
#定位到了指定的标签

# 查找注释并提取日期
comment = div_tag.find(string=lambda text: isinstance(text, Comment))
if comment:
    date = comment.strip().split(":")[-1]
    print("发布日期:", date)  # 输出: 2023-10-01
根据条件查找标签
soup.find_all(name,attrs,string)

#name 目的标签名,同时查找多个标签时格式为
#name=['标签名1','标签名2'],name=True时,查找出所有标签

#attrs 目的标签中的属性值,查找标签名与name相同,同时标签属性的所有值中有attrs的标签
#也可以直接对属性进行查找 soup.find_all(class="title")
# 查找class属性的值为"title"的标签

link = soup.find_all('a', {'class': 'sister', 'id': 'link2'})
#同时对多个属性查找

#string 对标签文本内容的查找(支持使用正则表达)

#limit 限制返回结果的数量,类似于 SQL 中的 `LIMIT` 关键字。
#当搜索到的结果数量达到限制时,停止搜索并返回结果


#recursive 控制是否检索所有子孙节点。
#如果设置为 `False`,则只搜索直接子节点



#函数作用:以列表的形式返回查找结果
#soup(……) ----------soup.find_all(……)

如上,为常用的查找方法,其中soup.find()的作用是查找第一个匹配的标签,找到后立马返回,不再继续查找,其参数与soup.find_all(……)相同。

根据CSS选择器查找标签

#可以直接使用标签名查找元素
title_tags = soup.select('title')
print(title_tags)


#使用(.类名)选择类查找元素
sister_links = soup.select('.sister')
print(sister_links)


#使用井号(`#id名`)选择ID查找元素
link1 = soup.select('#link1')
print(link1)


#使用空格选择后代元素
bold_text = soup.select('p b')
print(bold_text)


#使用大于号(`>子标签名`)选择直接子元素
direct_children = soup.select('body > p')
print(direct_children)  
# 输出: [<p class="title"><b>The Dormouse's story</b></p>,
#<p class="story">...</p>]

# 输出body下所有子标签中的p标签

#可以根据属性来选择元素
specific_link = soup.select('a[href="http://example.com/lacie"]') 
print(specific_link)


#可以使用伪类选择器,例如选择第一个元素
first_sister = soup.select('.sister:first-child')
print(first_sister)
#选择class="sister"的标签下的第一个子标签

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

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

相关文章

HTTP的Header

一、HTTP Header 是什么&#xff1f; HTTP Header 是 HTTP 协议中的头部信息部分&#xff0c;位于请求或响应的起始行之后&#xff0c;用来在客户端&#xff08;浏览器等&#xff09;与服务器之间传递元信息&#xff08;meta-data&#xff09;&#xff08;简单理解为传递信息的…

linux虚拟机网络问题处理

yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&arch…

AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 Qwen2.-1.5B/3B Llama factory llama.cpp 问题描述&#xff1a; AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B管家大模型 解决方案&#xff1a; 一、准备数据集我这…

协同推荐算法实现的智能商品推荐系统 - [基于springboot +vue]

&#x1f6cd;️ 智能商品推荐系统 - 基于springboot vue &#x1f680; 项目亮点 欢迎来到未来的购物体验&#xff01;我们的智能商品推荐系统就像您的私人购物顾问&#xff0c;它能读懂您的心思&#xff0c;了解您的喜好&#xff0c;为您精心挑选最适合的商品。想象一下&am…

Jenkins的地位和作用

所处位置 Jenkins 是一款开源的自动化服务器&#xff0c;广泛应用于软件开发和测试流程中&#xff0c;主要用于实现持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。它在开发和测试中的位置和作用可以从以下几个方面来理解&#xff1a; 1. 在开发和测…

【集合】底层原理实现及各集合之间的区别

文章目录 集合2.1 介绍一下集合2.2 集合遍历的方法2.3 线程安全的集合2.4 数组和集合的区别2.5 ArrayList和LinkedList的区别2.6 ArrayList底层原理2.7 LinkedList底层原理2.8 CopyOnWriteArrayList底层原理2.9 HashSet底层原理2.10 HashMap底层原理2.11 HashTable底层原理2.12…

srp batch

参考网址&#xff1a; Unity MaterialPropertyBlock 正确用法&#xff08;解决无法合批等问题&#xff09;_unity_define_instanced_prop的变量无法srp合批-CSDN博客 URP | 基础CG和HLSL区别 - 哔哩哔哩 (bilibili.com) 【直播回放】Unity 批处理/GPU Instancing/SRP Batche…

【Linux运维涉及的基础命令与排查方法大全】

文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议&#xff0c;Linux中常用命令&#xff0c;以及平时运维中使用的排查网络故障的…

Webview+Python:用HTML打造跨平台桌面应用的创新方案

目录 一、技术原理与优势分析 1.1 架构原理 1.2 核心优势 二、开发环境搭建 2.1 安装依赖 2.2 验证安装 三、核心功能开发 3.1 基础窗口管理 3.2 HTML↔Python通信 JavaScript调用Python Python调用JavaScript 四、高级功能实现 4.1 系统级集成 4.2 多窗口管理 五…

克服储能领域的数据处理瓶颈及AI拓展

对于储能研究人员来说&#xff0c;日常工作中经常围绕着一项核心但有时令人沮丧的任务&#xff1a;处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格&#xff0c;研究人员的大量时间都花在了提取有意义的见解上。长期以来&#xff0c;该领域一直受到对专…

包含物体obj与相机camera的 代数几何代码解释

反余弦函数的值域在 [0, pi] 斜体样式 cam_pose self._cameras[hand_realsense].camera.get_model_matrix() # cam2world# 物体到相机的向量 obj_tcp_vec cam_pose[:3, 3] - self.obj_pose.p dist np.linalg.norm(obj_tcp_vec) # 物体位姿的旋转矩阵 obj_rot_mat self.ob…

mybatis实现增删改查1

文章目录 19.MyBatis查询单行数据MapperScan 结果映射配置核心文件Results自定义映射到实体的关系 多行数据查询-完整过程插入数据配置mybatis 控制台日志 更新数据删除数据小结通过id复用结果映射模板xml处理结果映射 19.MyBatis 数据库访问 MyBatis&#xff0c;MyBatis-Plus…

Git,本地上传项目到github

一、Git的安装和下载 https://git-scm.com/ 进入官网&#xff0c;选择合适的版本下载 二、Github仓库创建 点击右上角New新建一个即可 三、本地项目上传 1、进入 要上传的项目目录&#xff0c;右键&#xff0c;选择Git Bash Here&#xff0c;进入终端Git 2、初始化临时仓库…

基于flask+vue框架的灯饰安装维修系统u49cf(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,工单人员,服务项目,订单记录,服务记录,评价记录 开题报告内容 基于 FlaskVue 框架的灯饰安装维修系统开题报告 一、选题背景与意义 &#xff08;一&#xff09;选题背景 随着城市化进程的加速与居民生活品质的显著提升&#xf…

【算法】BFS-解决FloodFill问题

目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思&#xff0c;假设有下面的一块田地&#xff0c;负数代表是凹地&#xff0c;正数代表是凸地&#xff0c;数字的大小表示凹或者凸的程度。现在下一场大雨&…

GIS开发笔记(10)基于osgearth实现二三维地图的一键指北功能

一、实现效果 二、实现原理 获取视图及地图操作器,通过地图操作器来重新设置视点,以俯仰角 (0.0)和偏航角 (-90.0)来设置。 osgEarth::Util::Viewpoint(…) 这里创建了一个新的 Viewpoint 对象,表示一个特定的视角。构造函数的参数是: 第一个参数:是视角名称。 后面的 6 个…

window上 elasticsearch v9.0 与 jmeter5.6.3版本 冲突,造成es 启动失败

[2025-04-22T11:00:22,508][ERROR][o.e.b.Elasticsearch ] [AIRUY] fatal exception while booting Elasticsearchjava.nio.file.NoSuchFileException: D:\Program Files\apache-jmeter-5.6.3\lib\logkit-2.0.jar 解决方案&#xff1a; 降低 es安装版本 &#xff0c;选择…

【C++初阶】第15课—模版进阶

文章目录 1. 模版参数2. 模版的特化2.1 概念2.2 函数模版特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化 3. 模版的分离和编译4. 总结 1. 模版参数 模版参数分为类型形参和非类型参数之前我们写过的大量代码&#xff0c;都是用模版定义类的参数类型&#xff0c;跟在class和typena…

黑阈免激活版:智能管理后台,优化手机性能

在使用安卓手机的过程中&#xff0c;许多用户会遇到手机卡顿、电池续航不足等问题。这些问题通常是由于后台运行的应用程序过多&#xff0c;占用大量系统资源导致的。今天&#xff0c;我们要介绍的 黑阈免激活版&#xff0c;就是这样一款由南京简域网络科技工作室开发的手机辅助…

Mujoco robosuite 机器人模型

import ctypes import os# 获取当前脚本所在的目录 script_dir os.path.dirname(os.path.abspath(__file__))# 构建库文件的相对路径 lib_relative_path os.path.join(dynamic_models, UR5e, Jb.so)# 拼接成完整的路径 lib_path os.path.join(script_dir, lib_relative_path…