目录

前言

一、pyquery 初始化

1.1 字符串初始化

1.2 URL 初始化

1.3 文件初始化

二、基本 CSS 选择器

三、pyquery 查找节点

3.1 子节点

3.2 父节点

3.3 兄弟节点

四、遍历

五、获取信息

5.1 获取属性

5.2 获取文本

六、节点操作

6.1 addClass 和 removeClass

6.2 attr、text、html

6.3 remove

七、伪类选择器


前言

        上两节我们讲了Beautiful Soup这个网页解析库,它确实很厉害。不过,大家用它的一些方法时,会不会感觉不太顺手?还有它的CSS选择器,用起来是不是觉得功能没那么强呢?

        要是你接触过Web开发,平时习惯用CSS选择器,或者对jQuery有一定了解,那我得给你介绍一个更称手的解析库,它就是pyquery。 下面,咱们就一起来见识下pyquery有多厉害。

一、pyquery 初始化

        在正式开始前,得先确认你已经把pyquery正确安装好了。要是还没安装,就得自己动手通过pip或pip3安装一下。 和Beautiful Soup类似,初始化pyquery时,同样要传入HTML文本,以此来创建一个PyQuery对象。它有好几种初始化的办法,既可以直接传入字符串,也能传入URL,还能传入文件名等等。接下来,我们就详细讲讲这些方法。 

1.1 字符串初始化

        咱们先通过一个实际例子来体验体验:

html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
for item in doc('li').items():print(item.outer_html())

运行结果如下:

        咱们先引入PyQuery对象,给它取个pq的别名。接着弄了个很长的HTML字符串,把这个字符串作为参数,传给PyQuery类,这样就完成了初始化。初始化完之后,再把得到的对象放到CSS选择器里。在这个例子里,我们输入li节点,这么一来,就能选中所有的li节点了 。 

1.2 URL 初始化

        初始化时,参数不只能用字符串形式来传递。要是你想传入网页的URL,也完全没问题,只要把参数指定为url就行 : 

from pyquery import PyQuery as pq
doc = pq(url='https://linshantang.blog.csdn.net/')
print(doc('title'))

运行结果:

<title>攻城狮7号-CSDN博客</title>

        这么操作后,PyQuery对象会先对这个URL发起请求。等拿到网页的HTML内容,就用这些内容完成初始化。这和直接把网页的源代码,以字符串形式传给PyQuery类来初始化,效果是一样的 。 

        它与下面的代码功能是相同的:

from pyquery import PyQuery as pq
import requests
doc = pq(requests.get('https://linshantang.blog.csdn.net/').text)
print(doc('title'))

1.3 文件初始化

        当然啦,初始化的时候,除了能传一个URL,要是你想传本地的文件名也是可以的,只要把参数指定成filename就行: 

from pyquery import PyQuery as pq
doc = pq(filename='demo.html')
print(doc('li'))

        当然,得先有个本地的HTML文件,叫demo.html,里面的内容就是要解析的HTML字符串。这样一来,它会先读取这个本地文件里的内容,接着把文件内容当成字符串,传给PyQuery类进行初始化。 

        上面这3种初始化方法都能用,不过在实际使用中,最常用的初始化方式还是用字符串来传递 。 

二、基本 CSS 选择器

        咱们先通过一个实际例子,来体验体验pyquery里CSS选择器该怎么用:

html = '''
<div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))

运行结果:

        这里呢,我们先初始化了PyQuery对象,接着输入了一个CSS选择器#container .list li 。这个选择器的意思是,先找到id是container的节点,再从这个节点里面,找到class是list的节点,最后把这个list节点里面所有的li节点选出来。然后我们把选出来的结果打印出来,能看到,确实成功找到了符合条件的节点。 最后呢,我们把选出来结果的类型也打印出来。可以看到,它还是PyQuery类型 。

三、pyquery 查找节点

        接下来给大家讲讲一些常用的查询方法,这些方法的使用方式跟jQuery里的方法一模一样 。

3.1 子节点

        要是想查找子节点,就得用find方法,这个方法的参数是CSS选择器。咱们还是拿上面那个HTML做例子来说: 

from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
print(type(items))
print(items)
lis = items.find('li')
print(type(lis))
print(lis)

运行结果:

        首先,我们选中class是list的节点,接着调用find()方法,把CSS选择器作为参数传进去,这样就选中了这个节点里面的li节点,最后把结果打印出来。可以看到,find()方法会把所有符合条件的节点都选出来,选出来的结果是PyQuery类型。 实际上,find方法会在节点的所有子孙节点里查找。要是我们只想找子节点,那就可以用children方法。

lis = items.children()
print(type(lis))
print(lis)

运行结果如下:

        要是想从所有子节点里挑出符合条件的节点,就拿筛选出子节点里class是active的节点来说,可以给children()方法传入CSS选择器.active。 

lis = items.children('.active')
print(lis)

运行结果:

        从输出结果能明显看出,已经筛选过了,只剩下class是active的节点 。

3.2 父节点

        我们可以用parent方法获取某个节点的父节点,下面通过一个例子来看看效果: 

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
container = items.parent()
print(type(container))
print(container)

运行结果如下:

        这里我们先用.list选中class是list的节点,接着调用parent方法,就能得到这个节点的父节点,这个父节点也是PyQuery类型。 这里得到的父节点是直接的父节点,不会再去查父节点的父节点,也就是不会找祖先节点。 要是想获取某个祖先节点,该咋整呢?这时候就可以用parents方法。

from pyquery import PyQuery as pq
doc = pq(html)
items = doc('.list')
parents = items.parents()
print(type(parents))
print(parents)

运行结果:

        能看到,输出结果有俩:一个是class为wrap的节点,另一个是id为container的节点。这说明,parents()方法会把所有的祖先节点都返回。 要是想筛选出某个祖先节点,就可以给parents方法传入CSS选择器,这样就能得到祖先节点里符合这个CSS选择器的节点。

parent = items.parents('.wrap')
print(parent)

运行结果:

        从输出结果能明显看出来,少了一个节点,现在只剩下class是wrap的那个节点了。

3.3 兄弟节点

        上面我们讲了子节点和父节点的用法,还有一种节点叫兄弟节点。要是想获取兄弟节点,可以用siblings()方法。咱们还是接着用上面的HTML代码来说明: 

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())

        这里先选中class是list的节点里面,class分别为item - 0和active的节点,也就是第三个li节点。显然,它有4个兄弟节点,分别是第一个、第二个、第四个和第五个li节点。 

运行结果:

        能看到,这就是我们刚才说的那4个兄弟节点。 要是想筛选出某个兄弟节点,还是可以给siblings方法传入CSS选择器,这样就能从所有兄弟节点里挑出符合条件的节点。

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings('.active'))

        这里我们筛选了 class 为 active 的节点,通过刚才的结果可以观察到,class 为 active 的兄弟节点只有第四个 li 节点,所以结果应该是一个。我们再看一下运行结果:

<li class="item-1 active"><a href="link4.html">fourth item</a></li>

四、遍历

        刚才能看到,pyquery选择出来的结果可能是多个节点,也可能是单个节点,但类型都是PyQuery类型,不会像Beautiful Soup那样返回列表。 要是选出来的是单个节点,既可以直接打印,也能直接转成字符串。

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(str(li))

运行结果:

        要是选择结果有多个节点,就得通过遍历来获取每个节点。就像这里,要遍历每个li节点的话,就得调用items方法。 

from pyquery import PyQuery as pq
doc = pq(html)
lis = doc('li').items()
print(type(lis))
for li in lis:print(li, type(li))

运行结果如下:

        能发现,调用items()方法后会得到一个生成器,对这个生成器进行遍历,就能逐个拿到li节点对象,这些对象也是PyQuery类型。每个li节点都能调用前面提到的方法来做选择操作,像接着查找子节点、找某个祖先节点之类的,用起来很灵活。

五、获取信息

        把节点提取出来以后,我们的最终目标肯定是要提取出节点里包含的信息。其中比较关键的信息有两种,一种是获取节点的属性,另一种是获取节点的文本内容。下面我就分别给大家讲一讲。 

5.1 获取属性

当提取到一个PyQuery类型的节点后,就能调用attr()方法来获取这个节点的属性了。

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a, type(a))
print(a.attr('href'))

运行结果如下:

<a href="link3.html"><span class="bold">third item</span></a> <class 'pyquery.pyquery.PyQuery'>
link3.html

        这里先选中class是item - 0和active的li节点里面的a节点,这个节点是PyQuery类型。 接着调用attr方法,在方法里传入属性名,就能得到对应的属性值。 另外,也能通过调用attr属性来获取属性,具体用法如下: 

print(a.attr.href)

        这两种方法得到的结果是完全相同的。 要是选中了多个元素,再去调用attr方法,会得到什么样的结果呢?下面我们通过实际例子来测试看看。

a = doc('a')
print(a, type(a))
print(a.attr('href'))
print(a.attr.href)

运行结果如下:

        按道理,我们选中的a节点应该有4个,打印结果也该是4个。但调用attr方法时,返回的却只有第一个节点的属性。这是因为,当返回结果包含多个节点时,调用attr方法只能得到第一个节点的属性。 要是遇到这种情况,想获取所有a节点的属性,就得用前面说过的遍历方法了。 

from pyquery import PyQuery as pq
doc = pq(html)
a = doc('a')
for item in a.items():print(item.attr('href'))

运行结果:

        所以,在获取属性的时候,要先看返回的节点是一个还是多个。要是返回多个节点,就得通过遍历才能逐个获取每个节点的属性。 

5.2 获取文本

        提取到节点后,另一个重要操作就是获取其内部的文本内容,这时调用text方法就能达成这一目的。 

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())

运行结果:

        这里先选中一个a节点,接着调用text方法,就能获取该节点内部的文本信息。这时它会把节点内部的所有HTML内容忽略掉,只返回纯文本。 不过要是想获取这个节点内部的HTML文本,那就得使用html方法了。

from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
print(li.html())

        这里我们选定了第三个li节点,随后调用了html()方法。该方法返回的结果会是这个li节点内包含的所有HTML文本内容。 

运行结果:

        这里存在一个疑问,如果我们选中的结果包含多个节点,那么调用 text() 或 html() 方法会返回什么样的内容呢?下面我们通过实际例子来探究一下。

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li')
print(li.html())
print(li.text())
print(type(li.text()))

运行结果如下:

        结果可能有点让人意外,html方法返回的是第一个li节点内部的HTML文本,而text方法返回的是所有li节点内部的纯文本,各文本间用一个空格分隔,也就是返回一个字符串。 所以这里要特别留意,如果得到的结果是多个节点,还想获取每个节点内部的HTML文本,那就需要对每个节点进行遍历。而text()方法不用遍历就能获取文本,它会把所有节点的文本提取出来并合并成一个字符串。

六、节点操作

        pyquery提供了一系列可对节点进行动态修改的方法,像给某个节点添加一个class,或者移除某个节点等。这些操作有时能为信息提取带来极大便利。 鉴于节点操作的方法众多,下面我会列举几个典型例子来说明其用法。

6.1 addClass 和 removeClass

        那咱们先通过一个具体的实例来体验一番:

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)

        先是选中了第三个li节点,接着调用removeClass()方法,把li节点上的active这个class给去掉了,之后又调用了addClass()方法,再把这个class添加回来。每次执行完一次操作,就把当前li节点的内容打印输出。 运行后得到的结果如下:

        从结果能看到,总共输出了3次。在第二次输出的时候,li节点的active这个class已经被移除掉了,而到第三次输出时,这个class又被重新添加回来了。 由此可见,addClass和removeClass这两个方法是能够对节点的class属性进行动态修改的。

6.2 attr、text、html

        当然,除了对 class 属性进行操作外,还能使用 attr 方法操作其他属性。另外,也可借助 text 和 html 方法来改变节点内部的内容。下面是相关示例: 

html = '''
<ul class="list"><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
</ul>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name', 'link')
print(li)
li.text('changed item')
print(li)
li.html('<span>changed item</span>')
print(li)

        这里我们先选中了li节点,之后调用attr方法修改属性。attr方法的第一个参数是属性名,第二个参数是属性值。接着,我们又调用text和html方法来改变节点内部的内容。每次操作完成后,都会打印输出当前的li节点。 下面是运行结果:

        可以看出,调用attr方法后,li节点新增了一个原本不存在的属性“name”,其值为“link”。随后调用text方法并传入文本,li节点内部的文本就都变成了传入的字符串文本。最后,调用html方法并传入HTML文本,li节点内部又变成了传入的HTML文本。 由此可知,attr方法若只传入第一个参数即属性名,是用于获取该属性值;若传入第二个参数,则可用来修改属性值。text和html方法若不传入参数,分别是获取节点内的纯文本和HTML文本;若传入参数,则是进行赋值操作。

6.3 remove

        从名字就能知道,remove 方法的作用是移除节点,在某些情况下,它能极大地便利信息提取。下面给出一段 HTML 文本,咱们接着分析它的应用。 

html = '''
<div class="wrap">Hello, World<p>This is a paragraph.</p></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
wrap = doc('.wrap')
print(wrap.text())

        现在你想提取“Hello, World”这个字符串,同时排除 p 节点内部的字符串,该怎么做呢? 这里直接先试着提取 class 为 wrap 的节点的内容,看看是否是我们想要的结果。下面是运行结果: 

 

 

        从这个结果能看出,它还包含了内部 p 节点的内容,也就是说 text 方法把所有纯文本都提取出来了。若想去掉 p 节点内部的文本,一种做法是先提取 p 节点内的文本,再从整个结果里移除这个子串,但这种做法显然比较繁琐。 这时就可以发挥 remove 方法的作用了,我们可以接着这样操作: 

wrap.find('p').remove()
print(wrap.text())

        首先我们选中 p 节点,接着调用 remove() 方法把它移除掉。此时,wrap 节点内部就只剩下“Hello, World”这句话了,之后利用 text() 方法就能把它提取出来。 此外,实际上还有不少节点操作的方法,像 append()、empty() 和 prepend() 等,这些方法的用法和 jQuery 完全相同。若想了解详细用法,可以参考官方文档:[http://pyquery.readthedocs.io/en/latest/api.html](http://pyquery.readthedocs.io/en/latest/api.html) 

 

七、伪类选择器

 

        CSS 选择器如此强大,一个重要原因是它支持丰富多样的伪类选择器。这些伪类选择器能实现很多特殊的选择功能,比如选择第一个节点、最后一个节点、奇偶数节点,以及包含特定文本的节点等。下面通过示例来具体说明: 

html = '''
<div class="wrap"><div id="container"><ul class="list"><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div></div>
'''
from pyquery import PyQuery as pq
doc = pq(html)
li = doc('li:first-child')
print(li)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')
print(li)
li = doc('li:gt(2)')
print(li)
li = doc('li:nth-child(2n)')
print(li)
li = doc('li:contains(second)')
print(li)

         在这个示例里,我们运用了 CSS3 的伪类选择器,分别选中了第一个 li 节点、最后一个 li 节点、第二个 li 节点、第三个 li 节点之后的所有 li 节点、偶数位置的 li 节点,以及包含“second”文本的 li 节点。 若你想了解 CSS 选择器更多的用法,可以参考 [http://www.w3school.com.cn/css/index.asp](http://www.w3school.com.cn/css/index.asp)。 

        至此,pyquery 的常用用法就介绍完毕了。要是你还想了解更多内容,可查阅 pyquery 的官方文档:[http://pyquery.readthedocs.io](http://pyquery.readthedocs.io)。我们相信,有了 pyquery 的助力,网页解析将不再困难。 

 

学习参考书籍:Python 3网络爬虫开发实战

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/75400.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/75400.shtml
英文地址,请注明出处:http://en.pswp.cn/web/75400.shtml

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

相关文章

【Hadoop入门】Hadoop生态之Pig简介

1 什么是Pig&#xff1f; 在大数据分析领域&#xff0c;Apache Pig是一个不可忽视的重要工具。Pig是Apache Hadoop生态系统中的一个高级数据分析平台&#xff0c;它提供了一种称为Pig Latin的脚本语言&#xff0c;用于简化大规模数据集的并行处理。Pig的核心思想是将复杂的数据…

python 语言 设计模式

python 语言 设计模式 设计模式是指在软件开发过程中,针对反复出现的问题所总结归纳出的通用解决方案。以下是一些常见的Python语言设计模式: 目录 python 语言 设计模式创建型模式结构型模式行为型模式创建型模式 单例模式 定义:保证一个类只有一个实例,并提供一个全局访…

QT QML布局

一、‌锚点布局(Anchors) 通过定义元素与其他元素或父容器的锚点关系实现定位,支持动态调整和边距控制‌。 Rectangle {anchors.left: parent.left // 左对齐父容器anchors.top: parent.top // 顶部对齐父容器anchors.margins: 10 // 统一设置四周边距width: …

【力扣03】无重复字符的最长子串

题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释:…

一文介绍阿里32B推理模型

什么是QwQ-32B&#xff1f; QwQ-32B并非普通的聊天机器人模型&#xff0c;而是推理模型。推理模型专注于逻辑拆解问题、分步推导&#xff0c;并输出结构化答案。 通过下面的示例&#xff0c;我们可以直观看到QwQ-32B的思考过程&#xff1a; qwq-32b思考过程 如果你需要写作辅…

AutoGen深度解析:从核心架构到多智能体协作的完整指南

AutoGen是微软推出的一个革命性多智能体(Multi-Agent)框架&#xff0c;它通过模块化设计和灵活的对话机制&#xff0c;极大地简化了基于大型语言模型(LLM)的智能体系统开发。本文将深入剖析AutoGen的两个核心模块——core基础架构和agentchat多智能体对话系统&#xff0c;带您全…

HTML的svg元素

<svg>元素 <svg>是一种用于描述二维矢量图形的 XML 格式&#xff0c;可以直接嵌入 HTML 文档中。 <svg>基本用法 <svg>的几种基本用法,包括圆形&#xff0c;正方形&#xff0c;三角形&#xff0c;直线 &#xff0c;折线等 <body><svg widt…

Qt 子项目依赖管理:从原理到实践的最佳分析:depends还是 CONFIG += ordered

1. 问题背景 在Qt项目开发中&#xff0c;当一个工程包含多个子项目&#xff08;如库、插件、测试模块&#xff09;时&#xff0c;如何正确管理它们的构建顺序和依赖关系&#xff1f; 如&#xff1a; 在开发一个包含核心库&#xff08;core&#xff09;、GUI模块&#xff08;g…

业务幂等性技术架构体系-接口幂等

接口幂等 对于幂等的考虑&#xff0c;主要解决两点前后端交互与服务间交互。这两点有时都要考虑幂等性的实现。从前端的思路解决 的话&#xff0c;主要有三种&#xff1a;前端防重、PRG模式、Token机制。 前端防重 通过前端防重保证幂等是最简单的实现方式&#xff0c;前端相关…

AI工具导航大全 | 2025精选版(持续更新)

&#x1f680; AI工具导航大全 | 2025精选版&#xff08;持续更新&#xff09; 更新日期&#xff1a;2025-04-11 | 适用场景&#xff1a;学术研究 | 办公提效 | 创意设计 | 开发编程 数据来源&#xff1a;综合高校实验室、企业实践及开发者社区推荐 &#x1f50d; 导航目录 &…

驱动-内核空间和用户空间数据交换

内核空间与用户控件数据交换 前面了解的字符设备中对 file_operations 结构体的进行了填充&#xff0c; 该 结构体的每一个成员都对应着一个系统调用&#xff0c; 例如 read、 write 等&#xff0c; 在字符设备相关的文章中有实验过对 调用函数进行了标志打印&#xff0c; 并没…

5G_WiFi_CE_DFS

目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择&#xff08;DFS&#xff09;要求 5、产品角色确定测试项目 6、测试项目 测试项1&#xff1a;信道可用性检查&#xff08;Channel Availability Check&#xff09; …

Devops之GitOps:什么是Gitops,以及它有什么优势

GitOps 定义 GitOps 是一种基于版本控制系统&#xff08;如 Git&#xff09;的运维实践&#xff0c;将 Git 作为基础设施和应用程序的唯一事实来源。通过声明式配置&#xff0c;系统自动同步 Git 仓库中的期望状态到实际运行环境&#xff0c;实现持续交付和自动化运维。其核心…

【蓝桥杯】单片机设计与开发,第十二届

/*头文件声明区*/ #include <STC15F2K60S2.H>//单片机寄存器头文件 #include <init.h>//初始化底层驱动头文件 #include <led.h>//led,蜂鸣器,继电器底层驱动头文件 #include <key.h>//按键底层驱动头文件 #include <seg.h>//数码管底层驱动头…

Vue3连接MQTT作为客户端

先下载依赖 npx --yes --registry https://registry.npmmirror.com npm install mqtt 在src的api创建 mes.js // 导入axios import axios from axios;// 定义一个变量,记录公共的前缀, baseURL const baseURL http://localhost:8080; const instance axios.create({ base…

主服务器和子服务器之间通过NFS实现文件夹共享

背景&#xff1a; 子服务器想做一个备份服务器 但是之前有很多文件是上传到本地的&#xff0c;于是服务要从本地读取文件 但是在不在同一台服务器中&#xff0c;读取就会有问题&#xff0c;想 实现在两者之间创建一个共享文件夹 一 NFS挂载步骤&#xff1a; 在主服务器&#…

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

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

【AI提示词】长期主义助手提供规划支持

提示说明 长期主义是一种关注长期利益和持续学习的思维模式&#xff0c;帮助个人和组织在快速变化的环境中保持耐心和系统性思考。 提示词 # Role: Long-termist Assistant## Profile - language: 中文 - description: 长期主义是一种关注长期利益和持续学习的思维模式&…

数组 array

1、数组定义 是一种用于存储多个相同类型数据的存储模型。 2、数组格式 &#xff08;1&#xff09;数据类型[ ] 变量名&#xff08;比较常见这种格式&#xff09; 例如&#xff1a; int [ ] arr0&#xff0c;定义了一个int类型的数组&#xff0c;数组名是arr0&#xff1b; &am…

基于JavaAPIforKml实现Kml 2.2版本的全量解析实践-以两步路网站为例

目录 前言 一、关于两步路网站 1、相关功能 2、数据结构介绍 二、JAK的集成与实现 1、JAK类图简介 2、解析最外层数据 3、解析扩展元数据和样式 4、递归循环解析Feature 5、解析具体的数据 三、结论 前言 随着地理信息技术的快速发展&#xff0c;地理空间数据的共享…