Python爬蟲第13節-解析庫pyquery 的使用

目錄

前言

一、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;地理空間數據的共享…