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

Python爬虫第11节-解析库Beautiful Soup的使用上篇

目录

前言

一、Beautiful Soup 简介

1.1 Beautiful Soup概述

1.2 准备工作

1.3 解析器

二、基本使用

三、节点选择器的使用

3.1 选择元素

3.2 提取信息

3.2.1 获取名称

3.2.2 获取属性

3.2.3 获取内容

3.3 嵌套选择

3.4 关联选择

3.4.1 子节点和子孙节点

3.4.2 父节点和祖先节点

3.4.3 兄弟节点

3.4.4 提取信息


前言

        在之前的内容中,我们深入探讨了正则表达式的多种用法。然而,正则表达式并非十全十美,一旦出现编写错误或逻辑漏洞,最终得到的结果往往与我们的预期大相径庭。

        网页作为一种具有特定结构和层级关系的信息载体,许多节点都通过 id 或 class 进行了明确区分。那么,能否利用这些网页的结构和属性特点,找到一种更为高效、准确的提取方法呢?

        在本节中,我们将为大家介绍一个强大的网页解析工具 ——Beautiful Soup。它能够依据网页的结构和属性等特性,轻松地对网页进行解析。使用 Beautiful Soup,我们无需再编写复杂冗长的正则表达式,只需几条简洁明了的语句,就能完成网页中特定元素的提取工作。

        接下来,让我们一起深入了解 Beautiful Soup 的强大功能,开启高效解析网页的新篇章!

一、Beautiful Soup 简介

1.1 Beautiful Soup概述

        简单来说,BeautifulSoup 是 Python 语言中一个专门用于解析 HTML 或 XML 的强大库。它提供了极为便捷的方式,能够轻松地从网页中抽取我们所需的数据。其官方对 BeautifulSoup 的解释为:

        BeautifulSoup 提供了一系列简单易用、充满 Python 风格的函数,这些函数可以实现导航、搜索、修改分析树等多种功能。它就像一个功能齐全的工具箱,通过对文档进行解析,为用户精准地提供所需抓取的数据。而且,BeautifulSoup 的使用非常简便,只需少量的代码,就能构建出一个功能完整的应用程序。

        此外,BeautifulSoup 还具备自动转换编码的功能。它会自动将输入的文档转换为 Unicode 编码,输出的文档则转换为 utf - 8 编码。当然,如果文档本身没有指定编码方式,用户只需简单说明原始编码方式即可。

        如今,BeautifulSoup 已经与 lxml、html5lib 等一样,成为了出色的 Python 解释器。它能够为用户灵活地提供不同的解析策略,并且在解析速度方面表现强劲。

        由此可见,借助 Beautiful Soup,我们可以大大简化繁琐的网页数据提取工作,显著提升解析效率。

1.2 准备工作

        在开始使用 Beautiful Soup 进行网页解析之前,请务必确保已经正确安装了 Beautiful Soup 和 lxml 库。如果还没有安装,请自行安装。

1.3 解析器

        Beautiful Soup 在进行网页解析时,实际上是依赖于解析器来完成工作的。它不仅支持 Python 标准库中自带的 HTML 解析器,还兼容一些功能强大的第三方解析器,比如 lxml。下面的表详细列出了 Beautiful Soup 所支持的各种解析器。

Beautiful Soup支持的解析器

        通过上述对比可以清晰地看出,lxml 解析器不仅具备解析 HTML 和 XML 的双重功能,而且在速度方面表现出色,同时还具有很强的容错能力。因此,我们强烈推荐使用 lxml 解析器。

        如果选择使用 lxml 解析器,在初始化 Beautiful Soup 对象时,只需将第二个参数设置为 lxml 即可。示例代码如下:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>Hello</p>', 'lxml')
print(soup.p.string)

        在后续关于 Beautiful Soup 的用法实例演示中,我们将统一采用 lxml 解析器进行讲解。

二、基本使用

        下面,我们通过一个具体的实例来深入了解 Beautiful Soup 的基本使用方法:

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
print(soup.title.string)

运行结果:

        在这个例子中,我们首先定义了一个名为 html 的变量,它存储了一段 HTML 字符串。需要注意的是,这段字符串并不是一个完整的 HTML 字符串,其中的 body 和 html 节点都没有闭合。

        接下来,我们将 html 字符串作为第一个参数传递给 BeautifulSoup 对象,同时将第二个参数设置为解析器类型 “lxml”,这样就完成了 BeautifulSoup 对象的初始化,并将其赋值给了 soup 变量。

        初始化完成后,我们就可以调用 soup 对象的各种方法和属性,来对这段 HTML 代码进行解析了。

        首先,我们调用了 prettify () 方法。这个方法的作用是将待解析的字符串以标准缩进格式输出,使代码结构更加清晰易读。需要特别注意的是,在输出结果中,我们可以看到原本未闭合的 body 和 html 节点都已经自动闭合了。这并不是 prettify () 方法的作用,而是在初始化 BeautifulSoup 对象时,它就已经自动对不规范的 HTML 字符串进行了格式校正。

        然后,我们调用了 soup.title.string。这里的 soup.title 可以选中 HTML 中的 title 节点,而 string 属性则用于获取该节点中的文本内容。通过这两个简单的属性调用,我们就轻松完成了文本的提取工作,充分体现了 Beautiful Soup 的便捷性。

三、节点选择器的使用

        在 Beautiful Soup 中,直接调用节点的名称就可以选择对应的节点元素,再调用 string 属性就能够获取节点内的文本内容。这种选择方式的优点是速度非常快,特别适用于单个节点结构层次清晰的情况。

3.1 选择元素

下面,我们通过一个具体的例子来详细说明如何选择元素:

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.title)
print(type(soup.title))
print(soup.title.string)
print(soup.head)
print(soup.p)

运行结果:

        在这个例子中,我们仍然使用了之前的 HTML 代码。首先,我们打印输出了 title 节点的选择结果,可以看到输出的正是 title 节点及其内部的文字内容。

        接着,我们输出了 title 节点的类型,结果是 bs4.element.Tag 类型。这是 Beautiful Soup 中一个非常重要的数据结构,经过选择器选择后的结果,通常都是这种 Tag 类型。

        Tag 类型具有一些实用的属性,比如 string 属性。当我们调用 string 属性时,就可以获取到节点的文本内容,这也正是接下来的输出结果。
 

        然后,我们尝试选择了 head 节点,输出结果显示的是 head 节点及其内部的所有内容。

        最后,我们选择了 p 节点。但这里需要注意的是,输出结果仅仅是第一个 p 节点的内容,后面的几个 p 节点并没有被选中。这表明,当存在多个相同节点时,这种直接调用节点名称的选择方式只会选择到第一个匹配的节点,而忽略后面的其他节点。

3.2 提取信息

        在前面的演示中,我们展示了如何通过调用 string 属性来获取节点文本的值。那么,如何获取节点属性的值呢?又如何获取节点的名称呢?下面,我们将对这些信息的提取方式进行统一梳理。

3.2.1 获取名称

        在 Beautiful Soup 中,可以利用 name 属性来获取节点的名称。我们还是以上面的文本为例,选取 title 节点,然后调用 name 属性,就可以得到节点的名称:

print(soup.title.name)

运行结果:

title

3.2.2 获取属性

        每个节点都可能拥有多个属性,比如常见的 id 和 class 等。在选择了一个节点元素后,可以通过调用 attrs 方法来获取该节点的所有属性:

print(soup.p.attrs)
print(soup.p.attrs['name'])

运行结果:

        从运行结果可以看出,attrs 的返回结果是一个字典形式,它将选择的节点的所有属性和属性值组合成了一个字典。

        如果我们想要获取某个特定的属性值,比如 name 属性,就相当于从字典中获取某个键值,只需要使用中括号加上属性名即可。例如,要获取 name 属性的值,可以通过 attrs['name'] 来实现。

        其实,还有一种更简便的获取属性值的方式,我们可以不用写 attrs,直接在节点元素后面加上中括号,传入属性名就可以获取属性值了。示例代码如下:

print(soup.p['name'])
print(soup.p['class'])

运行结果如下:

dromouse
['title']

        在这里需要注意的是,不同属性的返回结果类型可能不同。有的返回结果是字符串,比如 name 属性的值是唯一的,所以返回的是单个字符串;而对于 class 属性,一个节点元素可能有多个 class,因此返回的是一个由字符串组成的列表。在实际处理过程中,我们需要根据具体情况判断属性值的类型。

3.2.3 获取内容

        我们可以利用 string 属性来获取节点元素所包含的文本内容。例如,要获取第一个 p 节点的文本内容,可以使用以下代码:

print(soup.p.string)

运行结果如下:

The Dormouse's story

        再次强调,这里选择到的 p 节点是第一个 p 节点,获取的文本内容也是第一个 p 节点内部的文本。

3.3 嵌套选择

        在前面的例子中,我们知道每一个通过选择器得到的返回结果都是 bs4.element.Tag 类型。这种类型的对象同样可以继续调用节点进行下一步的选择,也就是所谓的嵌套选择。

        例如,我们先获取了 head 节点元素,然后可以继续调用 head 节点内部的 title 节点元素:

html = """
<html><head><title>The Dormouse's story</title></head>
<body>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.head.title)
print(type(soup.head.title))
print(soup.head.title.string)

运行结果如下:

        第一行输出结果是我们调用 head 之后再次调用 title 而选择的 title 节点元素。然后,我们打印输出了它的类型,可以看到它仍然是 bs4.element.Tag 类型。

        这说明,我们在 Tag 类型的基础上再次进行选择得到的结果依然是 Tag 类型。每次返回的结果类型都相同,这就为我们进行嵌套选择提供了可能。

        最后,我们输出了它的 string 属性,也就是该节点里的文本内容。

3.4 关联选择

        在实际进行节点选择时,有时候我们无法一步就选到想要的节点元素,而是需要先选中某一个节点元素,然后以它为基准,再去选择它的子节点、父节点、兄弟节点等。下面,我们就来详细介绍如何选择这些关联的节点元素。

3.4.1 子节点和子孙节点

        在选取了一个节点元素之后,如果我们想要获取它的直接子节点,可以调用 contents 属性。示例代码如下:

html = """
<html><head><title>The Dormouse's story</title></head><body><p class="story">Once upon a time there were three little sisters; and their names were<a href="http://example.com/elsie" class="sister" id="link1"><span>Elsie</span></a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>and<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>and they lived at the bottom of a well.</p><p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.p.contents)

运行结果如下:

 

        从运行结果可以看出,返回的结果是一个列表形式。p 节点中既包含了文本内容,又包含了其他节点元素,最终这些内容都会以列表的形式统一返回。

        需要注意的是,列表中的每个元素都是 p 节点的直接子节点。例如,第一个 a 节点里面包含了一层 span 节点,这相当于 p 节点的孙子节点,但在返回结果中,并没有单独把 span 节点选出来。也就是说,contents 属性得到的结果是直接子节点的列表。

        同样,我们也可以调用 children 属性来得到相应的结果:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.p.children)
for i, child in enumerate(soup.p.children):print(i, child)

运行结果如下:

 

        这里我们使用的是同样的 HTML 文本,调用 children 属性后,返回的结果是一个生成器类型。接下来,我们通过 for 循环遍历输出了相应的内容。

        如果我们想要得到所有的子孙节点,可以调用 descendants 属性:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.p.descendants)
for i, child in enumerate(soup.p.descendants):print(i, child)

运行结果如下:

        此时返回的结果依然是一个生成器。通过遍历输出可以看到,这次的输出结果包含了 span 节点。这是因为 descendants 属性会递归查询所有子节点,从而得到所有的子孙节点。

3.4.2 父节点和祖先节点

        如果我们要获取某个节点元素的父节点,可以调用 parent 属性。示例代码如下:

html = """
<html><head><title>The Dormouse's story</title></head><body><p class="story">Once upon a time there were three little sisters; and their names were<a href="http://example.com/elsie" class="sister" id="link1"><span>Elsie</span></a></p><p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.a.parent)

运行结果如下:

 

        在这个例子中,我们选择的是第一个 a 节点的父节点元素。很明显,a 节点的父节点是 p 节点,所以输出结果就是 p 节点及其内部的内容。

        需要注意的是,这里输出的仅仅是 a 节点的直接父节点,并没有再向外寻找父节点的祖先节点。如果我们想要获取所有的祖先节点,可以调用 parents 属性:

html = """
<html><body><p class="story"><a href="http://example.com/elsie" class="sister" id="link1"><span>Elsie</span></a></p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(type(soup.a.parents))
print(list(enumerate(soup.a.parents)))

运行结果如下:

        从运行结果可以发现,返回的结果是生成器类型。我们通过将其转换为列表,并输出了它的索引和内容,列表中的元素就是 a 节点的祖先节点。

3.4.3 兄弟节点

        前面我们介绍了子节点和父节点的获取方式,那么如果要获取同级的节点,也就是兄弟节点,应该怎么做呢?下面是一个示例:

html = """
<html><body><p class="story">Once upon a time there were three little sisters; and their names were<a href="http://example.com/elsie" class="sister" id="link1"><span>Elsie</span></a>Hello<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>and<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>and they lived at the bottom of a well.</p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print('Next Sibling', soup.a.next_sibling)
print('Prev Sibling', soup.a.previous_sibling)
print('Next Siblings', list(enumerate(soup.a.next_siblings)))
print('Prev Siblings', list(enumerate(soup.a.previous_siblings)))

运行结果如下:

        这里调用了 4 个属性,next_siblingprevious_sibling分别用于获取节点的下一个和上一个兄弟元素。如果目标节点没有对应的兄弟节点,previous_sibling可能返回None ,就像这里第一个<a>标签的previous_siblingnext_siblingsprevious_siblings则分别返回后面和前面的兄弟节点集合,返回结果是生成器类型,通过list()函数将其转换为列表以便查看所有兄弟节点。

3.4.4 提取信息

        刚才我们讲了怎么选择那些有关联的元素节点。要是现在想得到这些节点的文本内容、属性之类的信息,方法和前面介绍的差不多。下面通过例子来说明: 

html = """
<html><body><p class="story">Once upon a time there were three little sisters; and their names were<a href="http://example.com/elsie" class="sister" id="link1">Bob</a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a></p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print('Next Sibling:')
print(type(soup.a.next_sibling))
print(soup.a.next_sibling)
print(soup.a.next_sibling.string)
print('Parent:')
print(type(soup.a.parents))
print(list(soup.a.parents)[0])
print(list(soup.a.parents)[0].attrs['class'])

运行结果:

        要是选择节点的返回结果只有一个节点,那直接用string、attrs这些属性,就能拿到它的文本内容和属性信息。但要是返回的是一个能生成多个节点的生成器,就得先把它变成列表,从里面挑出想要的元素,接着再用string、attrs属性,这样才能得到对应节点的文本和属性。 

相关文章:

Python爬虫第11节-解析库Beautiful Soup的使用上篇

目录 前言 一、Beautiful Soup 简介 1.1 Beautiful Soup概述 1.2 准备工作 1.3 解析器 二、基本使用 三、节点选择器的使用 3.1 选择元素 3.2 提取信息 3.2.1 获取名称 3.2.2 获取属性 3.2.3 获取内容 3.3 嵌套选择 3.4 关联选择 3.4.1 子节点和子孙节点 3.4.2…...

host模式容器compose建立记录

需要一个host模式的容器&#xff0c;用来跑gpu程序。同时最好使用ssh来直接远程连接。 以前是直接建立容器然后手动安装ssh的。但是最近突然又不行了&#xff0c;不知道为什么。我知道原因是容器的systmctl不能使用。但是为什么以前能用呢&#xff1f; 一、安装结构 总之换成…...

LeetCode算法题(Go语言实现)_39

题目 给定一个二叉树的根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 一、代码实现 type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode }func rightSideView(root *TreeNode) []int {i…...

算法训练之动态规划(五)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

深度学习-156-RAG技术之在ubuntu中的安装部署RAGFlow和简单应用

文章目录 1 ubuntu中安装RAGFlow1.1 RAGFlow简介1.2 安装部署1.2.1 硬件要求1.2.2 修改max_map_count1.2.3 下载仓库代码1.2.4 自动拉取镜像1.2.5 查看端口占用(如果提示的话)1.2.6 启动与关闭RAGFlow2 访问应用2.1 添加模型2.2 创建知识库2.2.1 输入名称点击确定2.2.2 填写相关…...

自学Matlab-Simscape(初级)- 2.1 Simscape Multibody 模块之关节(运动副)

Matlab-Simscape自学系列文章目录 1.了解Simscape Multibody Link模块 2.掌握Simscape Multibody 模块 3.掌握Simscape Electrical模块 4.掌握Simscape Driveline 模块 5.了解Simscape Fluids模块 6.了解Simscape Battery模块 7.掌握Simscape Mechanical Interfaces 模块 8.掌…...

再次重拾jmeter之踩坑

1.添加“csv数据文件设置”&#xff0c;运行时提示 java.lang.IllegalArgumentException: Filename must not be null or empty检查多次后才发现因为我运行的是整个线程组&#xff0c;所以对应http请求下不能包括空的csv文件 2. 填写ip时不能加/&#xff0c;要在路径里加&…...

第六周作业

好的&#xff0c;这是移除外层代码块&#xff0c;并保留内部 Markdown 格式的作业内容&#xff1a; SQL 注入作业 1、联合注入实现“库名-表名-字段名-数据”的注入过程 &#xff08;1&#xff09;前端注入 尝试使用 database() 这个函数进行库名爆破 1 union select 1,data…...

学科发展视域下教师数字素养提升的多维路径研究

学科发展视域下教师数字素养提升的多维路径研究 —— 基于技术融合与教学创新的双重逻辑 一、引言&#xff1a;数字时代的学科教育转型 1.1 研究背景与意义 在当今时代&#xff0c;人工智能与教育数字化战略正以迅猛之势重塑着教育的格局&#xff0c;成为推动学科教学范式深…...

QEMU学习之路(6)— RISC-V 启动Linux

QEMU学习之路&#xff08;6&#xff09;— RISC-V 启动Linux 一、前言 参考&#xff1a;QEMU 启动方式分析&#xff08;1&#xff09;&#xff1a;QEMU 及 RISC-V 启动流程简介 QEMU 启动方式分析&#xff08;2&#xff09;: QEMU virt 平台下通过 OpenSBI U-Boot 引导 RISC…...

人工智能图像识别Spark Core3

Spark Core3 Spark-Core编程&#xff08;三&#xff09; 1.key-value类型&#xff1a; 23) sortByKey 函数签名 def sortByKey(ascending: Boolean true, numPartitions: Int self.partitions.length): RDD[(K, V)] 函数说明 在一个(K,V)的 RDD 上调用&#xff0c;K 必…...

STM32 模块化开发指南 · 第 5 篇 STM32 项目中断处理机制最佳实践:ISR、回调与事件通知

本文是《STM32 模块化开发实战指南》第 5 篇,聚焦于 STM32 裸机开发中最核心也最容易被忽视的部分——中断服务机制。我们将介绍如何正确、高效地设计中断处理函数(ISR),实现数据与事件从中断上下文传递到主逻辑的通道,并构建一个清晰、可维护、非阻塞的事件通知机制。 一…...

Vue报错解决方案

1.ResizeObserver loop completed with undelivered notifications. 解决方案&#xff1a; 在App.vue文件中添加以下代码&#xff1a; <script > const callLimit (callback, delay) > {let timer null;return function () {let context this;let args arguments;…...

vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值

项目场景&#xff1a; <el-table-column label"税率" prop"TaxRate" width"180" align"center" show-overflow-tooltip><template slot-scope"{row, $index}"><el-form-item :prop"InquiryItemList. …...

STM32 模块化开发指南 · 第 4 篇 用状态机管理 BLE 应用逻辑:分层解耦的实践方式

本文是《STM32 模块化开发实战指南》第 4 篇,聚焦于 BLE 模块中的状态管理问题。我们将介绍如何通过有限状态机(Finite State Machine, FSM)架构,实现 BLE 广播、扫描、连接等行为的解耦与可控,并配合事件队列驱动完成主从共存、低功耗友好、状态清晰的 BLE 应用。 一、为…...

计算机网络-传输层基础概念

传输层基础概念 1. 传输层基础概念1.1 传输层的定义与作用1.2 传输层在网络模型中的位置OSI七层模型中的传输层TCP/IP四层模型中的传输层传输层的数据单元传输层的地址机制 1.3 传输层与其他层的关系与网络层的关系与应用层的关系数据流转过程 1.4 传输层的主要功能1.4.1 复用与…...

使用Mybatis时在XML中SQL高亮显示的方法

如图所示&#xff0c;上方的SQL代码很像是一个字符串&#xff0c;那么如何把上方的SQL改成和下方一样的SQL,使得IDEA可以识别SQL方言呢&#xff1f; 1.选中SQL中的一部分代码&#xff0c;此时左侧会出现一个黄色的灯泡图案&#xff0c;点击2.选择这个注入语言或者引用...

Dify+DeepSeek能做出什么来?快速构建可扩展的 AI 应用

将 Dify&#xff08;开源 LLM 应用开发平台&#xff09;与 DeepSeek&#xff08;深度求索公司的高性能大模型&#xff0c;如 DeepSeek-R1 或 DeepSeek-Lite&#xff09;结合使用&#xff0c;可以充分发挥两者的优势&#xff0c;快速构建高效、灵活且可扩展的 AI 应用。以下是具…...

Python 类型转换详解

文章目录 Python 类型转换详解基本类型转换函数1. 转换为整数 (int())2. 转换为浮点数 (float())3. 转换为字符串 (str())4. 转换为布尔值 (bool()) 容器类型转换1. 转换为列表 (list())2. 转换为元组 (tuple())3. 转换为集合 (set())4. 转换为字典 (dict()) 特殊类型转换1. AS…...

针对deepseek的核心论文写作提示词模板(适用于SCI论文、CCF会议论文、北大核心论文、南大核心论文)

以下是一个适用于撰写核心论文的提示词模板,涵盖论文结构、关键内容和注意事项,帮助你高效组织思路和内容: 核心论文写作提示词模板(5000字) 1. 标题(Title) 提示词:简洁、明确、关键词、研究领域、创新点示例: “基于XX方法的XX问题研究”“XX现象对XX的影响:以XX为…...

Linux基础命令解释

目录 一、文件和目录操作命令 1. ls 2. cd 3. pwd 4. mkdir 5. rm 6. cp 7. mv 二、查看和编辑文件命令 1. cat 2. less 三、系统信息相关命令 四、网络相关命令 五、用户和权限管理命令 Linux是由Linus Torvalds于1991年开发的开源类Unix操作系统内核&#xff0…...

vue2基于video.js,v8.21.0自己设计一个视频播放器

刚开始在网上下了点视频教程想着用些电脑自带的播放器。后来级数太多了&#xff0c;操作不方便。就开始自己捣鼓了。 痛点是是视频教程本身带来的&#xff0c;不方便反复的找重点。过去了不好快退等。 就基于video.js,设计了各种功能&#xff0c;鼠标移到上方显示 播放、暂停…...

Spring Boot 中集成 Disruptor_高性能事件处理框架

1. 引言 1.1 什么是 Disruptor Disruptor 是一个高性能的事件处理框架,广泛应用于金融交易系统、日志记录、消息队列等领域。它通过无锁机制和环形缓冲区(Ring Buffer)实现高效的事件处理,具有极低的延迟和高吞吐量的特点。 1.2 为什么使用 Disruptor 高性能:通过无锁机…...

如何关闭MacOS中鼠标滚轮滚动加速

一、背景 想要关闭滚轮的 “滚动加速”&#xff0c;即希望滚动了多少就对应滚动页面固定行数&#xff0c;现在macOS是加速滚动的&#xff0c;即滚动相同的角度会根据你滚动滚轮的速度不同最终页面滚动的幅度不同。这点很烦&#xff0c;常导致很难定位。 macOS本身的设置是没有…...

QT Sqlite数据库-教程001 创建数据库和表-下

【1】创建带名称的数据库 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord> QString path QDir::currentPath(); QApplication::addLibraryPath(pathQString("/release/plugins")); QPluginLoader loader…...

玄机靶场-webshell查杀WP

0x01.黑客webshell里面的flag flag{xxxxx-xxxx-xxxx-xxxx-xxxx} 方法一 先去网站根目录找/var/www/html在文件中寻找 flag 方法二 直接使用工具 D 盾。 0x02黑客使用的什么工具的shell 把代码直接复制网上搜索即可。 https://github.com/BeichenDream/Godzilla 0x03 黑客隐…...

游戏引擎学习第217天

运行游戏并在 FreeVariableGroup 中遇到我们的断言 其实在美国&#xff0c;某些特定的小糖果&#xff08;例如小糖蛋&#xff09;只在圣诞节和复活节期间出售&#xff0c;导致有些人像我一样在这段时间吃得过多&#xff0c;进而增加体重。虽然这种情况每年都会发生&#xff0c…...

13、nRF52xx蓝牙学习(GPIOTE组件方式的任务配置)

下面再来探讨下驱动库如何实现任务的配置&#xff0c;驱动库的实现步骤应该和寄存器方式对应&#xff0c;关 键点就是如何调用驱动库的函数。 本例里同样的对比寄存器方式编写两路的 GPOITE 任务输出&#xff0c;一路配置为输出翻转&#xff0c;一路设 置为输出低电平。和 …...

基础数学:线性代数与优化理论

本篇文章简单带您复习线性代数与优化理论&#xff08;主要是我发表的文章中涉及过的或相关联的&#xff09; 微积分和概率与统计由此进&#xff1a;基础数学&#xff1a;微积分和概率与统计-CSDN博客 二、线性代数 1.矩阵运算 (1) 基础操作与几何意义 矩阵乘法&#xff1…...

IBM Rational Software Architect安装感受及使用初体验

1 安装感受 最近准备用UML 2.0绘制模型图。在读UML创始人之一Grady Booch写的书《Object-Oriented Analysis and Design with Applications》&#xff08;第3版&#xff09;1时&#xff0c;发现书中用的UML工具之一为IBM Rational Software Architect&#xff08;RSA&#xff…...

在WPS中通过JavaScript宏(JSA)调用DeepSeek官网API优化文档教程

在WPS中通过JavaScript宏&#xff08;JSA&#xff09;调用DeepSeek官网API优化文档教程 一、获取DeepSeek API密钥 访问DeepSeek官网&#xff0c;在开发者中心创建应用并生成API Key。注意选择deepseek - chat或deepseek - v3模型&#xff0c;推荐后者支持长文本生成。具体步…...

2025-Gateway架构

文章目录 1. **Spring Cloud Gateway**&#x1f9e0; **简介**&#xff1a;✅ **主要特性**&#xff1a;⚙️ **使用场景**&#xff1a; 2. **Kong Gateway**&#x1f9e0; **简介**&#xff1a;✅ **主要特性**&#xff1a;⚙️ **使用场景**&#xff1a; 3. **Zuul (Netflix)…...

Android HWComposer代码分析

厂家应该根据自己的硬件去写HWC的代码&#xff0c;一般位于hardware/厂家名称/hwcomposer目录中。 1 HAL_MODULE_INFO_SYM 在 Android 中&#xff0c;HAL_MODULE_INFO_SYM 结构体用于描述硬件抽象层&#xff08;HAL&#xff09;模块的信息&#xff0c;它会在系统启动过程中被…...

Java微服务分布式事务:CAP定理、BASE理论与事务模式全解析

在当今复杂的分布式系统中&#xff0c;数据一致性始终是架构师面临的核心挑战。本文将深入探讨分布式领域的三大基石理论&#xff08;CAP/BASE&#xff09;&#xff0c;并详解微服务场景下的五种主流事务解决方案&#xff0c;通过真实代码示例揭示技术实现本质。 一、分布式系统…...

多坐标系变换全解析:从相机到WGS-84的空间坐标系详解

多坐标系变换全解析:从相机到WGS-84的空间坐标系详解 一、常见坐标系简介二、各坐标系的功能和使用场景1. WGS-84 大地坐标系(经纬高)2. 地心直角坐标系(ECEF)3. 本地 ENU / NED 坐标系4. 平台坐标系(Body)5. 相机坐标系三、坐标变换流程图四、如何选用合适的坐标系?五…...

【微服务治理】Opentelemetry、 Jaeger、Prometheus、grafana 关系?各自作用?最佳实践?

OpenTelemetry、Jaeger、Prometheus 和 Grafana 是云原生可观测性领域的核心工具组&#xff0c;各自解决不同维度的问题&#xff0c;又能协作形成完整的监控体系。以下是它们的详细关系和功能说明&#xff1a; 1. OpenTelemetry 定位&#xff1a;统一的遥测数据标准&#xff0…...

谷歌25年春季新课:15小时速成机器学习

谷歌说15小时就能入门机器学习&#xff0c;虽然听上去有点离谱&#xff0c;但看了一下课程设置其实是很合理而且全面的&#xff0c;而且谷歌的质量还是很有保障&#xff0c;很适合零基础的小白以及想要进阶的学习者。&#x1f680; 基础知识部分包括 线性回归&#xff1a;用于…...

【笔试强训day16】

目录 第一题&#xff1a;字符串替换 描述 输入&#xff1a; 返回值&#xff1a; 第二题&#xff1a;神奇数 输入描述: 输出描述: 输入 输出 第三题&#xff1a;DNA序列 描述 输入描述&#xff1a; 输出描述&#xff1a; 输入&#xff1a; 输出&#xff1a; 输入…...

[每周一更]-(第139期):从FRP认识内网穿透及反向代理

文章目录 **一、FRP的核心功能与实战应用****1. 远程访问场景****2. Web服务暴露**Web服务访问实际案例&#xff1a;**3. 物联网与设备管理****4. 高级功能** **二、FRP性能优化与安全加固****三、同类工具对比与选型建议****四、总结与选型建议****特殊场景解决方案****1. 跨国…...

vue2使用ezuikit-js播放萤石视频

需求&#xff1a;需要在大屏上播放萤石视频&#xff0c;用到官方的ezuikit-js插件实现&#xff0c;并实现视频播放切换功能。有个问题至今没有解决&#xff0c;就是萤石视频的宽高是固定的&#xff0c;不会根据大屏缩放进行自适应。我这边做了简单的刷新自适应。 1.下载ezuikit…...

Nacos服务发现和配置管理

目录 一、Nacos概述 1. Nacos 简介 2. Nacos 特性 2.1 服务发现与健康监测 2.2 动态配置管理 2.3 动态DNS服务 2.4 其他关键特性 二、 服务注册和发现 2.1 核心概念 2.2 Nacos注册中心 2.3 Nacos单机模式 2.4 案例——服务注册与发现 2.4.1 父工程 2.4.2 order-p…...

DeepSeek实战:如何用AI工具提升销售转化率?

销售行业正在经历一场前所未有的变革&#xff0c;AI技术的快速发展让传统销售模式面临巨大挑战。如今&#xff0c;像DeepSeek这样的智能工具已经能高效完成客户触达、需求分析、快速回复等基础销售工作&#xff0c;甚至比人类更快、更精准。许多公司已经发现&#xff0c;AI销售…...

无锡无人机培训学校哪家好?

无锡无人机培训学校哪家好&#xff1f;近年来&#xff0c;无人机技术在各个领域的应用越来越广泛&#xff0c;从农业、物流到影视制作&#xff0c;无人机已经成为了许多行业不可或缺的工具。这种趋势促使越来越多的人希望通过系统的培训获得无人机驾驶技能。然而&#xff0c;在…...

从数据格式转换的角度 flink cdc 如何写入paimon?

从数据格式转换的角度 flink cdc 如何同步数据&#xff0c;写入paimon&#xff1f; 从一个测试用例着手 org/apache/flink/cdc/connectors/paimon/sink/v2/PaimonSinkITCase.java public void testSinkWithDataChange(String metastore, boolean enableDeleteVector)throws …...

Flink的 RecordWriter 数据通道 详解

本文从基础原理到代码层面逐步解释 Flink 的RecordWriter 数据通道&#xff0c;尽量让初学者也能理解。 1. 什么是 RecordWriter&#xff1f; 通俗理解 RecordWriter 是 Flink 中负责将数据从一个任务&#xff08;Task&#xff09;发送到下游任务的组件。想象一下&#xff0c;…...

从keys到SCAN:Redis批量删除的进化之路

标签:Redis、批量删除、前缀匹配、性能优化 一、痛点分析:为什么需要批量删除指定前缀的键? 在 Redis 使用过程中,我们经常会遇到这样的场景: 需要对某一类数据进行清理,例如用户会话、缓存数据等,而这些数据通常以某种前缀命名(如 user:session:*、cache:data:*)。如…...

uniapp实现目录树效果,异步加载数据

uniapp目录树 父组件调用目录树组件 <DaTreeVue2:data"treeData":field"{label: name,key: id,}"change"handleTreeChange":defaultCheckedKeys"addressDefaultCheckedKey":defaultExpandedKeys"addressDefaultCheckedKey&qu…...

机器学习--网格搜索

引言 在机器学习的广袤世界里&#xff0c;构建一个性能卓越的模型是众多从业者不懈追求的目标。而模型性能的好坏&#xff0c;很大程度上依赖于超参数的设置。今天&#xff0c;我们就来深入探讨一种常用且有效的超参数调优方法 —— 网格搜索。 一、什么是网格搜索 网格搜索…...

Asp.NET Core WebApi 创建带鉴权机制的Api

构建一个包含 JWT&#xff08;JSON Web Token&#xff09;鉴权的 Web API 是一种常见的做法&#xff0c;用于保护 API 端点并验证用户身份。以下是一个基于 ASP.NET Core 的完整示例&#xff0c;展示如何实现 JWT 鉴权。 1. 创建 ASP.NET Core Web API 项目 使用 .NET CLI 或 …...

同步电路与异步电路详解

一、基本概念与核心区别 特性同步电路异步电路时钟依赖依赖全局时钟信号&#xff08;如CLK&#xff09;统一触发所有操作无全局时钟&#xff0c;依赖事件&#xff08;如信号跳变&#xff09;或握手协议时序控制所有操作在时钟边沿&#xff08;上升/下降沿&#xff09;同步执行…...