BeautifulSoup 库的使用——python爬虫

文章目录

  • 写在前面
  • 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 BeautifulSoupwith 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的值,如果属性不存在返回Noneprint(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.标签名.previous_siblings
# 返回html代码顺序的后续所有平行节点标签
  1. 获取指定标签前序的所有平行标签(即按html代码顺序排在指定标签前的所有兄弟标签)
soup.标签名.previous_siblings 
#返回html代码顺序的前序所有平行节点标签
获取注释

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

Comment类的作用;

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

定位注释:

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

from bs4 import BeautifulSoup, Commenthtml = '''
<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, Commenthtml = '''
<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.mzph.cn/news/902210.shtml

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

相关文章

关于MacOS使用Homebrew的详细介绍

Homebrew 是 macOS&#xff08;和 Linux&#xff09;上最流行的包管理工具&#xff08;Package Manager&#xff09;&#xff0c;用于快速安装、更新和管理各种开发工具、命令行程序、开源软件等。它类似于&#xff1a; Ubuntu/Debian 的 aptCentOS/RHEL 的 yumWindows 的 Cho…

最新扣子空间实操指南

一、首先要先获取到内部测试的邀请码&#xff0c; 我们先打开扣子空间官网&#xff1a;https://space.coze.cn/ 输入邀请码后进入该页面&#xff1a; 它这里支持文件上传&#xff0c;扩展里面有很多插件&#xff0c;页支持MCP各种插件. 探索模式有两种&#xff0c;一种是ai自…

ubuntu22.04安装dukto

1.添加源 sudo add-apt-repository ppa:xuzhen666/dukto2.进行更新和安装 sudo apt update sudo apt install dukto3.报错 $ sudo apt install dukto 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 您也许需要…

Java编程基础(第四篇:字符串初次介绍)

前言 HelloWorld写的多了&#xff0c;语法熟悉一点了吧&#xff0c;其中有段代码还没介绍&#xff0c;它就是字符串 public class HelloWorld { public static void main(String[] args) { printBaby(); } static void printBaby() { System.out.print("baby"); } } …

安卓手机怎样配置数据加速

利用系统自带功能&#xff1a; 选择网络模式&#xff1a;进入手机 “设置”&#xff0c;找到 “网络” 或 “移动网络” 选项&#xff0c;点击 “高级设置”&#xff0c;选择合适的网络模式&#xff0c;如优先选择 4G 或 5G 网络&#xff0c;以获得更快的速度。开启网络加速功能…

Day3:个人中心页面布局前端项目uniapp壁纸实战

接下来我们来弄一下个人中心页面布局user.vue <template><view class"userLayout"><view class"userInfo"><view class"avatar"><image src"../../static/Kx.jpg" mode"aspectFill"></im…

线性回归之正则化(regularization)

文章目录 机器学习中的"防过拟合神器"&#xff1a;正则化全解析1. 正则化&#xff1a;不只是"规矩"那么简单1.1 鲁棒性案例说明 2. L1正则化&#xff1a;冷酷的特征选择器3. L2正则化&#xff1a;温柔的约束者4. L1 vs L2&#xff1a;兄弟间的较量5. 正则化…

mapbox基础,加载视频到地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀加载视频到…

Linux系统的远程终端登录、远程图形桌面访问、 X图形窗口访问

目录 一、配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 2.查看当前ip、子网掩码、网关 3.修改配置文件 二、远程终端登录Ubuntu 三、使用XShell远程连接 1、确保SSH服务已启动 2、检查SSH服务状态 3、获取树莓派IP地址 4、Xming安装好之后打开让它在后台…

多模态大语言模型arxiv论文略读(三十一)

From GPT-4 to Gemini and Beyond: Assessing the Landscape of MLLMs on Generalizability, Trustworthiness and Causality through Four Modalities ➡️ 论文标题&#xff1a;From GPT-4 to Gemini and Beyond: Assessing the Landscape of MLLMs on Generalizability, Tr…

基于Matlab求解矩阵电容等效容值

1需求 仿真测试8*10阶举证电容等效容值。 2模型搭建 2.1打开simscape 在打开simulink之后打开simscape库&#xff0c;Simscape库位置如下 2.2搭建模型 在库中寻找需要的元件搭建电路。 2.2.1基本元件 电阻电容电感等基础器件&#xff0c;搭建电路之后需要对其进行幅值&…

【C++】 —— 笔试刷题day_22

一、添加字符 题目解析 这道题&#xff0c;给定两个字符串A和B&#xff0c;字符串A的长度要小于B的长度&#xff1b; 现在我们要对A字符串添加字符&#xff0c;使得A字符串长度等于B字符串的长度&#xff0c;并且要求对应位置的字母尽量相等&#xff0c;然后求出来不相等的字符…

错误: 找不到或无法加载主类 HelloWorld,cmd窗口,java命令,提示

错误: 找不到或无法加载主类 HelloWorld 解决办法 检查classpath是否 .; 开头的

手撕LLM(五):从源码出发,探索多模态VL模型的推理全流程

前面我们分享了关于大语言模型的相关技术&#xff0c;包括前向推理、LoRa挂载、MoE模型、模型预训练等&#xff1b;后续还是会基于MiniMindLM模型继续分享关于大语言模型的SFT指令微调、LoRa微调、基于人类偏好的强化学习微调以及模型蒸馏相关的技术&#xff0c;请大家持续关注…

关于隔离2:ADC芯片

ADC可以称作是模拟芯片领域的明珠。作为一种关键器件&#xff0c;ADC设计难度大&#xff0c;专利墙高&#xff0c;所以国内一直处于追赶的状态。近年来&#xff0c;国产ADC发展极为迅速&#xff0c;逐渐在各项参数上赶上了国际主流水准。 模拟数字转换器ADC连接着现实模拟世界…

【MySQL】前缀索引、索引下推、访问方法,自适应哈希索引

最左前缀原则 对于INDEX(name, age)来说最左前缀可以是联合索引的最左N个字段, 也可以是字符串索引的最左M个字符。 SELECT * FROM t WHERE name LIKE 张%其效果和单独创建一个INDEX(name)的效果是一样的若通过调整索引字段的顺序, 可以少维护一个索引树, 那么这个顺序就是需要…

【Oracle专栏】Oracle中的虚拟列

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 在EXP方式导出时&#xff0c;发现 出现如下提示 EXP-00107: virtual column 不支持&#xff0c;因此采用expdp方式导出。于是本文针对oracle虚拟列进行简单介绍。 2. 相…

Nacos深度剖析与实践应用之-配置中心

&#x1f4f9; 简介 在微服务架构中&#xff0c;配置管理是至关重要的基础能力。Nacos作为阿里巴巴开源的一体化动态服务发现、配置管理和服务管理平台&#xff0c;其配置中心模块提供了统一配置管理、动态配置推送、多环境支持等核心能力。相比传统配置文件方式&#xff0c;Na…

gma 2.1.4 (2025.04.18) | GmaGIS V0.0.1a3 更新日志

安装 gma 2.1.4 pip install gma2.1.4网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版继…

在 Node.js 中设置响应的 MIME 类型

在 Node.js 中设置响应的 MIME 类型是为了让浏览器正确解析服务器返回的内容&#xff0c;比如 HTML、CSS、图片、JSON 等。我们通常通过设置响应头中的 Content-Type 字段来完成。 ✅ 一、什么是 MIME 类型&#xff08;Content-Type&#xff09;&#xff1f; MIME&#xff08;…