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 大模型呼出机器人在实际应用中展现出了一系列优势和劣势,以下是对其优势和劣势的详细分析ÿ…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
