当前位置: 首页 > news >正文

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.stringobj.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一样&#xff0c;是一个html的解析器&#xff0c;主要功能也是解析数据和提取数据 。 本模块作为了解模块&#xff0c;实际开发中很少用这个模块去解析数据&#xff0c;大家可能会想为什么这个模块会逐渐被淘汰&…...

MySQL 时区参数 time_zone 详解

文章目录 前言1. 时区参数影响2. 如何设置3. 字段类型选择 前言 MySQL 时区参数 time_zone 有什么用&#xff1f;修改它有什么影响&#xff1f;如何设置该参数&#xff0c;本篇文章会详细介绍。 1. 时区参数影响 time_zone 参数影响着 MySQL 系统函数还有字段的 DEFAULT CUR…...

Redis - 消息队列 Stream

一、概述 消息队列 定义 消息队列模型&#xff1a;一种分布式系统中的消息传递方案&#xff0c;由消息队列、生产者和消费者组成消息队列&#xff1a;负责存储和管理消息的中间件&#xff0c;也称为消息代理&#xff08;Message Broker&#xff09;生产者&#xff1a;负责 产…...

Docker:国内加速源

阿里云docker加速云&#xff1a; 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

一、吐槽 过去&#xff0c;在安卓项目中配置JDK和Gradle的过程非常直观&#xff0c;只需要进入Android Studio的File菜单中的Project Structure即可进行设置&#xff0c;十分方便。 原本可以在这修改JDK: 但大家都知道&#xff0c;Android Studio的狗屎性能&#xff0c;再加…...

ubuntu+ros新手笔记(四):gazebo无法加载

以下为ChatGPT 的解决方案&#xff0c;对我来说是可行的&#xff01;&#xff01; 我按照第2步操作就解决辣&#xff01;&#xff01; 我的提问&#xff1a; 在ubuntu 22.04 和ros2 humble环境下&#xff0c;gazebo加载不了 ChatGPT 回答&#xff1a; 在 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开发的场景&#xff0c;大多对代码的执行的速度&#xff0c;实时性有较高的要求&#xff0c;像嵌入式系统的开发&#xff0c;资源还受限。在算力存储空间有限的MCU上写出简洁又高效的代码实际是一种艺术。软件工程师在代码设计上的这种差距&#xff0c;会反映在产品的性…...

通俗易懂的 Nginx 反向代理 配置

通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif &#xff0c;/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…...

docker设置容器自动启动

说起开机自动启动应该很多人都遇到过&#xff0c;我们公司做的系统很多的中间件都没有设置开机自动启动然后中间修改问题又设置了一些临时生效的文件&#xff0c;开始的时候大家都不以为意&#xff0c;知道公司陆续有人离职入职管理交接一塌糊涂&#xff0c;项目成了历史遗留问…...

蓝桥杯刷题——day1

蓝桥杯刷题——day1 题目一题干题目解析代码 题目二题干题目解析代码 题目一 题干 给定一个字符串 s &#xff0c;验证 s 是否是 回文串 &#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。本题中&#xff0c;将空字符串定义为有效的 回文串 。 题目链接&a…...

Leetcode 面试150题 399.除法求值

系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图&#xff1a;给定图中的一些点&#xff08;点即变量&#xff09;&#xff0c;以及某些边的权值&#xff08;权值即两个变量的比值&#xff09;&#xff0c;试…...

活动预告 |【Part2】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识

课程介绍 通过参加“Microsoft 安全在线技术公开课&#xff1a;安全性、合规性和身份基础知识”活动提升你的技能。在本次免费的介绍性活动中&#xff0c;你将获得所需的安全技能和培训&#xff0c;以创造影响力并利用机会推动职业发展。你将了解安全性、合规性和身份的基础知…...

Unity游戏实战

很小的时候在键盘机上玩过一个游戏叫寻秦&#xff0c;最近看有大佬把他的安卓版做出来了&#xff0c;打开封面就是Unity&#xff0c;想自己也尝试一下。...

SQL中的替换函数replace() 使用

这条 SQL 语句的作用是将 tool_tool 表中所有 link 字段包含 https://www.xxspvip.cn 的记录中的 https://www.xxspvip.cn 替换为 http://192.168.1.1。具体解释如下&#xff1a; SQL 语句分解 UPDATE tool_toolSET link REPLACE(link, https://www.xxspvip.cn, http://192.…...

Python面试常见问题及答案5

一、基础语法相关 问题1&#xff1a; Python的可变数据类型和不可变数据类型有哪些&#xff1f; 答案&#xff1a; 在Python中&#xff0c;可变数据类型有列表&#xff08;list&#xff09;、字典&#xff08;dict&#xff09;、集合&#xff08;set&#xff09;。这些数据类型…...

(css)element中el-select下拉框整体样式修改

(css)element中el-select下拉框整体样式修改 重点代码&#xff08;颜色可行修改&#xff09; // 修改input默认值颜色 兼容其它主流浏览器 /deep/ input::-webkit-input-placeholder {color: rgba(255, 255, 255, 0.50); } /deep/ input::-moz-input-placeholder {color: rgba…...

点击按钮打开dialog嵌套表格checked数据关闭dialog回显checked数据

介绍&#xff1a;点击按钮打开dialog嵌套表格&#xff0c;勾选数据&#xff0c;点击确认关闭弹窗并且回显选中得数据&#xff0c;回显的数据被删除&#xff0c;dialog里面的数据也被取消勾选&#xff0c;废话不多说 上代码&#xff01;&#xff01;&#xff01; 这里的勾选回显…...

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(三) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…...

大模型呼出机器人有哪些优势和劣势?

大模型呼出机器人有哪些优势和劣势&#xff1f; 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼出机器人在实际应用中展现出了一系列优势和劣势&#xff0c;以下是对其优势和劣势的详细分析&#xff…...

SAP ABAP SM30表维护:手把手教你实现‘运费类型’重复描述校验(附完整代码与避坑指南)

SAP ABAP SM30表维护实战&#xff1a;运费类型唯一性校验的深度解析 在物流管理系统中&#xff0c;运费类型的定义往往需要遵循严格的业务规则。一个常见的需求是确保"运输类型运费代码"与"运费描述"的组合具有唯一性&#xff0c;避免因描述重复导致的操作…...

【C++笔记】内存管理流食般投喂

声明&#xff1a;以下知识相关资料来自比特官网和小编手搓~C/C内存管理1、C/C内存分布2、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3、C内存管理方式3.1、new/delete操作内置类型3.2、new和delete操作自定义类型4、operator new 与 operator delete 函数…...

实战解析:如何用Qualcomm AI Engine Direct的OpPackage机制为你的AI模型添加自定义算子

深度实战&#xff1a;利用Qualcomm AI Engine Direct的OpPackage机制实现自定义算子全流程开发 在移动端AI模型部署的实践中&#xff0c;我们常常会遇到一个关键挑战&#xff1a;当模型包含特殊算子或自研算法时&#xff0c;如何在不修改底层框架的前提下实现高效执行&#xff…...

智慧树自动刷课插件:5分钟告别手动点击,学习效率提升300%

智慧树自动刷课插件&#xff1a;5分钟告别手动点击&#xff0c;学习效率提升300% 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还记得那个深夜&#xff0c;你盯着智慧…...

2026年5款专业气象数据可视化软件大盘点

在科技飞速发展的今天&#xff0c;气象可视化作为一种将复杂气象数据转化为直观图像的技术&#xff0c;正发挥着越来越重要的作用。它不仅为气象工作者提供了便捷的数据分析手段&#xff0c;也让普通大众能够轻松理解天气变化。接下来&#xff0c;让我们一起深入了解气象可视化…...

美团春招笔试“小美的朋友关系”全网无AC?我用逆向并查集搞定它(附完整代码)

逆向并查集&#xff1a;破解美团笔试"小美的朋友关系"难题 大厂算法笔试中&#xff0c;总有一两道题能卡住绝大多数求职者。今年美团春招的"小美的朋友关系"就是这样一道"拦路虎"——全网找不到AC代码&#xff0c;无数人在超时和错误答案中挣扎。…...

CANN/asc-devkit log1pf函数文档

log1pf 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/can…...

emacs-which-key替代方案对比:为什么它成为Emacs 30标准功能

emacs-which-key替代方案对比&#xff1a;为什么它成为Emacs 30标准功能 【免费下载链接】emacs-which-key Emacs package that displays available keybindings in popup 项目地址: https://gitcode.com/gh_mirrors/em/emacs-which-key emacs-which-key是一款能够在Ema…...

FPGA设计避坑指南:Vivado里那些红色和橙色的时钟交互框到底意味着什么?

FPGA设计避坑指南&#xff1a;Vivado里那些红色和橙色的时钟交互框到底意味着什么&#xff1f; 在FPGA设计的世界里&#xff0c;时钟信号就像城市交通系统中的红绿灯&#xff0c;协调着数据流的行进节奏。而当多个时钟域交汇时&#xff0c;就如同多个交通系统试图相互对接——如…...

从RTL到GDS:STA工程师的一天,如何用DC工具修复时序违例(以Setup Violation为例)

从RTL到GDS&#xff1a;STA工程师的一天&#xff0c;如何用DC工具修复时序违例&#xff08;以Setup Violation为例&#xff09; 时钟刚过上午9点&#xff0c;咖啡的香气弥漫在工位周围。作为数字后端工程师&#xff0c;我习惯在晨会前先快速扫描昨晚综合运行的日志文件。今天的…...