bs4基本运用
1. bs4基本使用
1.1. 简介
bs4的全称为 BeautifulSoup。和lxml一样,是一个html的解析器,主要功能也是解析数据和提取数据 。
本模块作为了解模块,实际开发中很少用这个模块去解析数据,大家可能会想为什么这个模块会逐渐被淘汰,它就真的一点优点都没有吗?优点吧其实也有,比如设计的接口比较人性化,使用起来比较方便,支持css选择器等等,但是缺点也是非常致命的,就是它的效率是没有 xpath 高,程序界都是很讲效率的,那既然 xpath 也很好用,效率也高,自然而然就没有bs4的市场了,但是大家也要了解该模块,可以不用,但是不能不知道。
1.2. 安装
pip install bs4
这里需要注意的一点是,如果你的项目是一个全新的项目文件,你只安装上bs4也是用不了该模块的解析方法的,还需要下载安装一个lxml库,因为bs4是依赖lxml的,不然是会报错的。都有lxml库了,正常都使用xpath了对吧,谁还去特意再安装bs4,这也是bs4被淘汰的一点因素。
安装成功之后想要在python程序当中使用的话就直接导入该模块即可。
from bs4 import BeautifulSoup
1.3. 基础语法
<!DOCTYPE html>
<html lang="en" xmlns=""><head><meta charset="UTF-8"><title>Title</title></head><body><div><ul><li id="l1" class="a1">张三</li><li id="l2">李四</li><li>王五</li><a id="Hello" href="" class="a1">Hello World</a><a id="Hello1" href="" class="a1">Hello 美女</a><span>嘿嘿嘿</span></ul></div><a href="https://www.baidu.com" title="a2">百度</a><a href="https://www.xiaomi.com" title="a3">小米</a><div id="d1"><span><h1>哈哈哈</h1></span></div><p id="p1" class="p1">呵呵呵</p><a href="">京东</a></body>
</html>
from bs4 import BeautifulSoupsoup = BeautifulSoup(open('index.html', encoding='utf8'), 'lxml')
当操作的对象是文件时,就可以使用open('文件路径', encoding='utf8')以指定编码打开文件进行操作,当操作对象就是我们获取的响应时,就可以更改为BeautifulSoup(response, 'lxml'),lxml是操作内核,也有其他的内核,但是lxml内核效率更高。
1.3.1.节点定位
from bs4 import BeautifulSoupsoup = BeautifulSoup(open('index.html', encoding='utf8'), 'lxml')# 1.根据标签名进行查找
print(soup.a) # 获取到第一个a标签 类型为 <class 'bs4.element.Tag'>
# 输出结果为:<a class="a1" href="" id="Hello">Hello World</a>print(soup.a.attrs) # 获取到第一个a标签的属性值 字典类型
# 输出结果为:{'id': 'Hello', 'href': '', 'class': ['a1']}# 2.函数方法 find() 和 find_all()
print(soup.find('a')) # 等同于soup.a
#输出结果为: <a class="a1" href="" id="Hello">Hello World</a>
print(type(soup.find('a'))) # <class 'bs4.element.Tag'>print(soup.find_all('a')) # 获取所有的a标签,返回的是一个列表
# 输出结果为:[<a class="a1" href="" id="Hello">Hello World</a>, <a class="a1" href="" id="Hello1">Hello 美女</a>, <a href="https://www.baidu.com" title="a2">百度</a>, <a href="https://www.xiaomi.com" title="a3">小米</a>, <a href="">京东</a>]print(soup.find('a', title="a2")) # 获取title属性值为a2的a标签
# 输出结果:<a href="https://www.baidu.com" title="a2">百度</a>print(soup.find('a', class_="a1")) # 获取class值为a1的a标签,class属性需要在最后面加上_
# 输出结果为:<a class="a1" href="" id="Hello">Hello World</a>print(soup.find_all('a', class_="a1")) # 获取到所有class值为a1的a标签
# 输出结果为:[<a class="a1" href="" id="Hello">Hello World</a>, <a class="a1" href="" id="Hello1">Hello 美女</a>]print(soup.find_all(['a', 'p'])) # 同时获取多个标签,这里是同时获取所有a标签和p标签
# 输出结果为:[<a class="a1" href="" id="Hello">Hello World</a>, <a class="a1" href="" id="Hello1">Hello 美女</a>, <a href="https://www.baidu.com" title="a2">百度</a>, <a href="https://www.xiaomi.com" title="a3">小米</a>, <p class="p1" id="p1">呵呵呵</p>, <a href="">京东</a>]# 3.select() css选择器
print(soup.select('a')) # 获取所有a标签 输出结果与.find_all('a')相同print(soup.select('#l2')) # 获取id属性值为l2的标签,返回值为列表,哪怕结果只有一个
# 输出结果:[<li id="l2">李四</li>]print(soup.select('.a1')) # 获取所有class属性值为a1的标签
# 输出结果:[<li class="a1" id="l1">张三</li>, <a class="a1" href="" id="Hello">Hello World</a>, <a class="a1" href="" id="Hello1">Hello 美女</a>]# 属性选择器
print(soup.select('a[class="a1"]')) # 获取class属性值为a1的a标签,等同于.find_all('a', class_="a1"))
# 输出结果:[<a class="a1" href="" id="Hello">Hello World</a>, <a class="a1" href="" id="Hello1">Hello 美女</a>]print(soup.select('a[class]')) # 获取有class属性的a标签
# 输出结果:[<a class="a1" href="" id="Hello">Hello World</a>, <a class="a1" href="" id="Hello1">Hello 美女</a>]# 层级选择器
print(soup.select('div li')) # 获取div标签下面的所有后代li标签 后代选择器 可跨多个节点
# 输出结果为:[<li class="a1" id="l1">张三</li>, <li id="l2">李四</li>, <li>王五</li>]print(soup.select('div > ul > li')) # 获取div标签下的子代ul标签下的子代li节点 子代选择器 只能一级一级向下递
# 输出结果为:[<li class="a1" id="l1">张三</li>, <li id="l2">李四</li>, <li>王五</li>]print(soup.select('span, p')) # 获取所有的span标签和p标签
# 输出结果为:[<span>嘿嘿嘿</span>, <span>
# <h1>哈哈哈</h1>
# </span>, <p class="p1" id="p1">呵呵呵</p>]
1.3.2. 节点信息
from bs4 import BeautifulSoupsoup = BeautifulSoup(open('index.html', encoding='utf8'), 'lxml')obj = soup.select('li[id="l1"]')[0] # 获取di属性值为l1的li节点
print(obj) # <li class="a1" id="l1">张三</li>
print(type(obj)) # <class 'bs4.element.Tag'>
获取文本
现在节点是拿到了,那如果想要获取文本信息或者属性值又该如何获取呢?获取文本信息有两种方法。obj.string与obj.get_text()。

看起来是一样的功能一样的效果,但其实也是有区别的。
from bs4 import BeautifulSoupsoup = BeautifulSoup(open('index.html', encoding='utf8'), 'lxml')obj = soup.select('div[id="d1"]>span')[0] # 获取id值为d1的div下面的子代span标签
print(obj)

这个span标签内部包裹了h1标签,文本值是在h1标签里面包裹的,这个时候再使用上述两个方法获取文本值。

是不是发现不同的地方了,也就是说,当文本值不是当前标签直接包含的时候,.string方法获取不到值,就会返回None,而.get_text()则是不管包裹到当前标签的哪一个后代标签里面,都会把文本值拿到。
获取属性值
from bs4 import BeautifulSoupsoup = BeautifulSoup(open('index.html', encoding='utf8'), 'lxml')obj = soup.select('a[title="a2"]')[0] # 获取title值为a2的a标签
print(obj)
# 输出结果为:<a href="https://www.baidu.com" title="a2">百度</a>print(obj.attrs)
# 输出结果为:{'href': 'https://www.baidu.com', 'title': 'a2'} 字典
可以看到,.attrs属性值返回的是标签所有的属性值字典,需要取哪个具体值就直接使用字典取值方式取值即可,也就是obj.attrs.get("href"),也有其他的快捷取值方法。
...
print(obj.attrs.get("href"))
print(obj.get("href"))
print(obj["href"])

三种方式都能获取到,喜欢用哪种就用哪种。
相关文章:
bs4基本运用
1. bs4基本使用 1.1. 简介 bs4的全称为 BeautifulSoup。和lxml一样,是一个html的解析器,主要功能也是解析数据和提取数据 。 本模块作为了解模块,实际开发中很少用这个模块去解析数据,大家可能会想为什么这个模块会逐渐被淘汰&…...
MySQL 时区参数 time_zone 详解
文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用?修改它有什么影响?如何设置该参数,本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CUR…...
Redis - 消息队列 Stream
一、概述 消息队列 定义 消息队列模型:一种分布式系统中的消息传递方案,由消息队列、生产者和消费者组成消息队列:负责存储和管理消息的中间件,也称为消息代理(Message Broker)生产者:负责 产…...
Docker:国内加速源
阿里云docker加速云: sudo tee /etc/docker/daemon.json <<EOF { “registry-mirrors”: [“https://euf11uji.mirror.aliyuncs.com”] } EOFhttps://docker.mozhu.dev/ sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": [&qu…...
Android Studio更改项目使用的JDK
一、吐槽 过去,在安卓项目中配置JDK和Gradle的过程非常直观,只需要进入Android Studio的File菜单中的Project Structure即可进行设置,十分方便。 原本可以在这修改JDK: 但大家都知道,Android Studio的狗屎性能,再加…...
ubuntu+ros新手笔记(四):gazebo无法加载
以下为ChatGPT 的解决方案,对我来说是可行的!! 我按照第2步操作就解决辣!! 我的提问: 在ubuntu 22.04 和ros2 humble环境下,gazebo加载不了 ChatGPT 回答: 在 Ubuntu 22.04 和 …...
vue季度选择器(antd2.0 版本无此控件,单独写一个)
vue季度选择器 效果显示 效果显示 <template><div><a-popoverplacement"bottom"overlayClassName"season-picker"trigger"click"v-model"showSeason"><template #content><div class"season-picker-b…...
C/C++代码性能优化技巧的书籍及资料
使用C/C开发的场景,大多对代码的执行的速度,实时性有较高的要求,像嵌入式系统的开发,资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距,会反映在产品的性…...
通俗易懂的 Nginx 反向代理 配置
通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif ,/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…...
docker设置容器自动启动
说起开机自动启动应该很多人都遇到过,我们公司做的系统很多的中间件都没有设置开机自动启动然后中间修改问题又设置了一些临时生效的文件,开始的时候大家都不以为意,知道公司陆续有人离职入职管理交接一塌糊涂,项目成了历史遗留问…...
蓝桥杯刷题——day1
蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的 回文串 。 题目链接&a…...
Leetcode 面试150题 399.除法求值
系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图:给定图中的一些点(点即变量),以及某些边的权值(权值即两个变量的比值),试…...
活动预告 |【Part2】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识
课程介绍 通过参加“Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中,你将获得所需的安全技能和培训,以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知…...
Unity游戏实战
很小的时候在键盘机上玩过一个游戏叫寻秦,最近看有大佬把他的安卓版做出来了,打开封面就是Unity,想自己也尝试一下。...
SQL中的替换函数replace() 使用
这条 SQL 语句的作用是将 tool_tool 表中所有 link 字段包含 https://www.xxspvip.cn 的记录中的 https://www.xxspvip.cn 替换为 http://192.168.1.1。具体解释如下: SQL 语句分解 UPDATE tool_toolSET link REPLACE(link, https://www.xxspvip.cn, http://192.…...
Python面试常见问题及答案5
一、基础语法相关 问题1: Python的可变数据类型和不可变数据类型有哪些? 答案: 在Python中,可变数据类型有列表(list)、字典(dict)、集合(set)。这些数据类型…...
(css)element中el-select下拉框整体样式修改
(css)element中el-select下拉框整体样式修改 重点代码(颜色可行修改) // 修改input默认值颜色 兼容其它主流浏览器 /deep/ input::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.50); } /deep/ input::-moz-input-placeholder {color: rgba…...
点击按钮打开dialog嵌套表格checked数据关闭dialog回显checked数据
介绍:点击按钮打开dialog嵌套表格,勾选数据,点击确认关闭弹窗并且回显选中得数据,回显的数据被删除,dialog里面的数据也被取消勾选,废话不多说 上代码!!! 这里的勾选回显…...
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三)
《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...
大模型呼出机器人有哪些优势和劣势?
大模型呼出机器人有哪些优势和劣势? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 大模型呼出机器人在实际应用中展现出了一系列优势和劣势,以下是对其优势和劣势的详细分析ÿ…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
