【Python3網絡爬蟲開發實戰】4-解析庫的使用-3 使用pyquery

在上一節中,我們介紹了Beautiful Soup的用法,它是一個非常強大的網頁解析庫,你是否覺得它的一些方法用起來有點不適應?有沒有覺得它的CSS選擇器的功能沒有那么強大?

如果你對Web有所涉及,如果你比較喜歡用CSS選擇器,如果你對jQuery有所了解,那么這里有一個更適合你的解析庫——pyquery。

接下來,我們就來感受一下pyquery的強大之處。

1. 準備工作

在開始之前,請確保已經正確安裝好了pyquery。若沒有安裝,可以參考第1章的安裝過程。

2. 初始化

像Beautiful Soup一樣,初始化pyquery的時候,也需要傳入HTML文本來初始化一個PyQuery對象。它的初始化方式有多種,比如直接傳入字符串,傳入URL,傳入文件名,等等。下面我們來詳細介紹一下。

字符串初始化

首先,我們用一個實例來感受一下:

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)
print(doc('li'))
復制代碼

運行結果如下:

<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>
復制代碼

這里首先引入PyQuery這個對象,取別名為pq。然后聲明了一個長HTML字符串,并將其當作參數傳遞給PyQuery類,這樣就成功完成了初始化。接下來,將初始化的對象傳入CSS選擇器。在這個實例中,我們傳入li節點,這樣就可以選擇所有的li節點。

URL初始化

初始化的參數不僅可以以字符串的形式傳遞,還可以傳入網頁的URL,此時只需要指定參數為url即可:

from pyquery import PyQuery as pq
doc = pq(url='http://cuiqingcai.com')
print(doc('title'))
復制代碼

運行結果如下:

<title>靜覓丨崔慶才的個人博客</title>
復制代碼

這樣的話,PyQuery對象會首先請求這個URL,然后用得到的HTML內容完成初始化,這其實就相當于用網頁的源代碼以字符串的形式傳遞給PyQuery類來初始化。

它與下面的功能是相同的:

from pyquery import PyQuery as pq
import requests
doc = pq(requests.get('http://cuiqingcai.com').text)
print(doc('title'))
復制代碼

文件初始化

當然,除了傳遞URL,還可以傳遞本地的文件名,此時將參數指定為filename即可:

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

當然,這里需要有一個本地HTML文件demo.html,其內容是待解析的HTML字符串。這樣它會首先讀取本地的文件內容,然后用文件內容以字符串的形式傳遞給PyQuery類來初始化。

以上3種初始化方式均可,當然最常用的初始化方式還是以字符串形式傳遞。

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')))
復制代碼

運行結果如下:

<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>
<class 'pyquery.pyquery.PyQuery'>
復制代碼

這里我們初始化PyQuery對象之后,傳入了一個CSS選擇器#container .list li,它的意思是先選取idcontainer的節點,然后再選取其內部的classlist的節點內部的所有li節點。然后,打印輸出。可以看到,我們成功獲取到了符合條件的節點。

最后,將它的類型打印輸出。可以看到,它的類型依然是PyQuery類型。

4. 查找節點

下面我們介紹一些常用的查詢函數,這些函數和jQuery中函數的用法完全相同。

子節點

查找子節點時,需要用到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 'pyquery.pyquery.PyQuery'>
<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>
<class 'pyquery.pyquery.PyQuery'>
<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>
復制代碼

首先,我們選取classlist的節點,然后調用了find()方法,傳入CSS選擇器,選取其內部的li節點,最后打印輸出。可以發現,find()方法會將符合條件的所有節點選擇出來,結果的類型是PyQuery類型。

其實find()的查找范圍是節點的所有子孫節點,而如果我們只想查找子節點,那么可以用children()方法:

lis = items.children()
print(type(lis))
print(lis)
復制代碼

運行結果如下:

<class 'pyquery.pyquery.PyQuery'>
<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>
復制代碼

如果要篩選所有子節點中符合條件的節點,比如想篩選出子節點中classactive的節點,可以向children()方法傳入CSS選擇器.active

lis = items.children('.active')
print(lis)
復制代碼

運行結果如下:

<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>
復制代碼

可以看到,輸出結果已經做了篩選,留下了classactive的節點。

父節點

我們可以用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)
復制代碼

運行結果如下:

<class 'pyquery.pyquery.PyQuery'>
<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>
復制代碼

這里我們首先用.list選取classlist的節點,然后調用parent()方法得到其父節點,其類型依然是PyQuery類型。

這里的父節點是該節點的直接父節點,也就是說,它不會再去查找父節點的父節點,即祖先節點。

但是如果想獲取某個祖先節點,該怎么辦呢?這時可以用parents()方法:

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

運行結果如下:

<class 'pyquery.pyquery.PyQuery'>
<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><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>
復制代碼

可以看到,輸出結果有兩個:一個是classwrap的節點,一個是idcontainer的節點。也就是說,parents()方法會返回所有的祖先節點。

如果想要篩選某個祖先節點的話,可以向parents()方法傳入CSS選擇器,這樣就會返回祖先節點中符合CSS選擇器的節點:

parent = items.parents('.wrap')
print(parent)
復制代碼

運行結果如下:

<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>
復制代碼

可以看到,輸出結果少了一個節點,只保留了classwrap的節點。

兄弟節點

前面我們說明了子節點和父節點的用法,還有一種節點,那就是兄弟節點。如果要獲取兄弟節點,可以使用siblings()方法。這里還是以上面的HTML代碼為例:

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

這里首先選擇classlist的節點內部classitem-0active的節點,也就是第三個li節點。那么,很明顯,它的兄弟節點有4個,那就是第一、二、四、五個li節點。

運行結果如下:

<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0">first item</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>
復制代碼

可以看到,這正是我們剛才所說的4個兄弟節點。

如果要篩選某個兄弟節點,我們依然可以向siblings方法傳入CSS選擇器,這樣就會從所有兄弟節點中挑選出符合條件的節點了:

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

這里我們篩選了classactive的節點,通過剛才的結果可以觀察到,classactive的兄弟節點只有第四個li節點,所以結果應該是一個。

我們再看一下運行結果:

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

5. 遍歷

剛才可以觀察到,pyquery的選擇結果可能是多個節點,也可能是單個節點,類型都是PyQuery類型,并沒有返回像Beautiful Soup那樣的列表。

對于單個節點來說,可以直接打印輸出,也可以直接轉成字符串:

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

運行結果如下:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></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))
復制代碼

運行結果如下:

<class 'generator'>
<li class="item-0">first item</li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-1"><a href="link2.html">second item</a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-1 active"><a href="link4.html">fourth item</a></li>
<class 'pyquery.pyquery.PyQuery'>
<li class="item-0"><a href="link5.html">fifth item</a></li>
<class 'pyquery.pyquery.PyQuery'>
復制代碼

可以發現,調用items()方法后,會得到一個生成器,遍歷一下,就可以逐個得到li節點對象了,它的類型也是PyQuery類型。每個li節點還可以調用前面所說的方法進行選擇,比如繼續查詢子節點,尋找某個祖先節點等,非常靈活。

6. 獲取信息

提取到節點之后,我們的最終目的當然是提取節點所包含的信息了。比較重要的信息有兩類,一是獲取屬性,二是獲取文本,下面分別進行說明。

獲取屬性

提取到某個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
復制代碼

這里首先選中classitem-0activeli節點內的a節點,它的類型是PyQuery類型。

然后調用attr()方法。在這個方法中傳入屬性的名稱,就可以得到這個屬性值了。

此外,也可以通過調用attr屬性來獲取屬性,用法如下:

print(a.attr.href)
復制代碼

結果如下:

link3.html
復制代碼

這兩種方法的結果完全一樣。

如果選中的是多個元素,然后調用attr()方法,會出現怎樣的結果呢?我們用實例來測試一下:

a = doc('a')
print(a, type(a))
print(a.attr('href'))
print(a.attr.href)
復制代碼

運行結果如下:

<a href="link2.html">second item</a><a href="link3.html"><span class="bold">third item</span></a><a href="link4.html">fourth item</a><a href="link5.html">fifth item</a> <class 'pyquery.pyquery.PyQuery'>
link2.html
link2.html
復制代碼

照理來說,我們選中的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'))
復制代碼

此時的運行結果如下:

link2.html
link3.html
link4.html
link5.html
復制代碼

因此,在進行屬性獲取時,可以觀察返回節點是一個還是多個,如果是多個,則需要遍歷才能依次獲取每個節點的屬性。

獲取文本

獲取節點之后的另一個主要操作就是獲取其內部的文本了,此時可以調用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 href="link3.html"><span class="bold">third item</span></a>
third item
復制代碼

這里首先選中一個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文本。

運行結果如下:

<a href="link3.html"><span class="bold">third item</span></a>
復制代碼

這里同樣有一個問題,如果我們選中的結果是多個節點,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())
復制代碼

運行結果如下:

<a href="link2.html">second item</a>
second item third item fourth item fifth item
<class 'str'>
復制代碼

結果可能比較出乎意料,html()方法返回的是第一個li節點的內部HTML文本,而text()則返回了所有的li節點內部的純文本,中間用一個空格分割開,即返回結果是一個字符串。

所以這個地方值得注意,如果得到的結果是多個節點,并且想要獲取每個節點的內部HTML文本,則需要遍歷每個節點。而text()方法不需要遍歷就可以獲取,它將所有節點取文本之后合并成一個字符串。

7. 節點操作

pyquery提供了一系列方法來對節點進行動態修改,比如為某個節點添加一個class,移除某個節點等,這些操作有時候會為提取信息帶來極大的便利。

由于節點操作的方法太多,下面舉幾個典型的例子來說明它的用法。

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節點的內容。

運行結果如下:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
復制代碼

可以看到,一共輸出了3次。第二次輸出時,li節點的active這個class被移除了,第三次class又添加回來了。

所以說,addClass()removeClass()這些方法可以動態改變節點的class屬性。

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()方法來修改屬性,其中該方法的第一個參數為屬性名,第二個參數為屬性值。接著,調用text()html()方法來改變節點內部的內容。三次操作后,分別打印輸出當前的li節點。

運行結果如下:

<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active" name="link"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-0 active" name="link">changed item</li>
<li class="item-0 active" name="link"><span>changed item</span></li>
復制代碼

可以發現,調用attr()方法后,li節點多了一個原本不存在的屬性name,其值為link。接著調用text()方法,傳入文本之后,li節點內部的文本全被改為傳入的字符串文本了。最后,調用html()方法傳入HTML文本后,li節點內部又變為傳入的HTML文本了。

所以說,如果attr()方法只傳入第一個參數的屬性名,則是獲取這個屬性值;如果傳入第二個參數,可以用來修改屬性值。text()html()方法如果不傳參數,則是獲取節點內純文本和HTML文本;如果傳入參數,則進行賦值。

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節點內部的字符串,需要怎樣操作呢?

這里直接先嘗試提取classwrap的節點的內容,看看是不是我們想要的。運行結果如下:

Hello, World This is a paragraph.
復制代碼

這個結果還包含了內部的p節點的內容,也就是說text()把所有的純文本全提取出來了。如果我們想去掉p節點內部的文本,可以選擇再把p節點內的文本提取一遍,然后從整個結果中移除這個子串,但這個做法明顯比較煩瑣。

這時remove()方法就可以派上用場了,我們可以接著這么做:

wrap.find('p').remove()
print(wrap.text())
復制代碼

首先選中p節點,然后調用了remove()方法將其移除,然后這時wrap內部就只剩下Hello, World這句話了,然后再利用text()方法提取即可。

另外,其實還有很多節點操作的方法,比如append()empty()prepend()等方法,它們和jQuery的用法完全一致,詳細的用法可以參考官方文檔:pyquery.readthedocs.io/en/latest/a…。

8. 偽類選擇器

CSS選擇器之所以強大,還有一個很重要的原因,那就是它支持多種多樣的偽類選擇器,例如選擇第一個節點、最后一個節點、奇偶數節點、包含某一文本的節點等。示例如下:

li = doc('li:contains(second)')
print(li)
復制代碼

這里我們使用了CSS3的偽類選擇器,依次選擇了第一個li節點、最后一個li節點、第二個li節點、第三個li之后的li節點、偶數位置的li節點、包含second文本的li節點。

關于CSS選擇器的更多用法,可以參考www.w3school.com.cn/css/index.a…。

到此為止,pyquery的常用用法就介紹完了。如果想查看更多的內容,可以參考pyquery的官方文檔:pyquery.readthedocs.io。我們相信有了它,解析網頁不再是難事。


本資源首發于崔慶才的個人博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓

如想了解更多爬蟲資訊,請關注我的個人微信公眾號:進擊的Coder

weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

世上最偉大的十個公式,質能方程排名第五

英國科學期刊《物理世界》曾讓讀者投票評選了“最偉大的公式”&#xff0c;最終榜上有名的十個公式既有無人不知的112&#xff0c;又有著名的Emc2&#xff1b;既有簡單的-圓周公式&#xff0c;又有復雜的歐拉公式…… 從什么時候起我們開始厭惡數學&#xff1f;這些東西原本…

爬蟲二(urllib模塊)

1、在python2和python3中的差異 在python2中&#xff0c;urllib和urllib2各有各自的功能&#xff0c;雖然urllib2是urllib的升級版&#xff0c;但是urllib2還是不能完全替代urllib&#xff0c;但是在python3中&#xff0c;全部封裝成一個類&#xff0c;即urllib python2中urlli…

逆向工程

軟件的逆向工程是分析程序以便在比源代碼更高的抽象層次上創建出程序的某種表示的過程&#xff0c;也就是說&#xff0c;逆向工程是一個恢復設計結果的過程&#xff0c;逆向工程工具從現存的程序代碼中抽取有關數據、體系結構和處理過程的設計信息。 簡單的說根據已有的東西和…

protocol buffer使用小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 、使用EditPlus定義好一份proto文件&#xff08;用EditPlus是為了不出現亂碼&#xff09;&#xff0c;如下 &#xff1a; package mypac…

2000服務器文件共享,Win2000 Server實現對共享文件的監控

病毒的出現&#xff0c;使我們在共享文件時變得異常小心。那么&#xff0c;有沒有辦法監控共享文件的使用情況并加以管理呢&#xff1f;有&#xff0c;用Windows 2000 Server的文件共享監控功能就可以實現。Windows 2000 Server的共享管理功能在“計算機管理”中&#xff0c;它…

學成在線--1.CMS接口開發

文章目錄0.定義CMS1.CMS頁面管理2.需求分析3.模型類介紹4.定義請求及響應類型5.定義接口6.創建CMS工程結構7.Dao1&#xff09;創建Dao&#xff0c;繼承MongoRepository2&#xff09;編寫測試類分頁查詢測試添加刪除修改8.Service9.Controller10.接口開發規范0.定義CMS 1&#…

django 進階

django進階 django的分頁器 基礎語法&#xff1a; View Code簡單練習&#xff1a; View Code實例應用&#xff1a; View Code自定義分頁&#xff1a; View Codeform表單系統 原生form View CodeDjango表單系統中&#xff0c;所有的表單類都作為django.forms.Form的子類創建&…

BZOJ 2440: [中山市選2011]完全平方數

Time Limit: 10 Sec Memory Limit: 128 MB Submit: 5160 Solved: 2515 [Submit][Status][Discuss] Description 小 X 自幼就很喜歡數。但奇怪的是&#xff0c;他十分討厭完全平方數。他覺得這些 數看起來很令人難受。由此&#xff0c;他也討厭所有是完全平方數的正整數倍的…

如何減小與“大牛”的差距

為什么同樣的時間有的人可以漂亮的完成工作&#xff0c;而有些人廢了很大的力氣也沒有完成&#xff1f; 前者我們常常稱之為“大牛”&#xff0c;后者我們常常叫他們“菜鳥”。當然“大牛”都是相對而言的&#xff0c;“大牛”也不可能方方面面都非常厲害&#xff0c;換句話說大…

軟件再工程

軟件再工程是指對既存對象系統進行調查&#xff0c;并將其重構為新形式代碼的開發過程。最大限度地重用既存系統的各種資源是再工程的最重要特點之一。從軟件重用方法學來說&#xff0c;如何開發可重用軟件和如何構造采用可重用軟件的系統體系結構是兩個最關鍵問題。不過對再工…

武俠乂怎么修改服務器,武俠乂怎么操作 按鍵功能詳細介紹

武俠乂將在7月27日開啟限量測試了&#xff0c;入手前的第一件事情當然要熟悉操作按鍵了&#xff0c;下面給大家帶來的是武俠乂按鍵介紹&#xff0c;一起來看看吧。武俠乂將在7月27日開啟限量測試了&#xff0c;玩家們馬上就能體會到武俠吃雞的快感&#xff0c;除了吃雞模式外還…

RMI使用小例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1、定義一個接口&#xff08;繼承Remote&#xff09;&#xff1a; 方法要拋RemoteException。 package rmi; import java.rmi.RemoteEx…

產品經理和項目經理有哪些區別?

1.產品經理和項目經理的差異 首先&#xff0c;產品經理和項目經理的職責定義不太一樣。 產品經理是 Product Manager &#xff0c;主要是負責市場調研、用戶研究并根據用戶的需求&#xff0c;定義和設計產品&#xff0c;然后考慮產品的商業模式、運營推廣方式等。接下來去推動…

09-完整性約束

本節重點&#xff1a; not null 與 defaultuniqueprimaryauto_incrementforeign key一、介紹 約束條件與數據類型的寬度一樣&#xff0c;都是可選參數 作用&#xff1a;用于保證數據的完整性和一致性 主要分為&#xff1a; PRIMARY KEY (PK) #標識該字段為該表的主鍵&#x…

fread rb與r,wb,w的區別

在fread時&#xff0c;"rb"與"r"對某些字符作用&#xff0c;是不同的&#xff1b; 文本模式和二進制模式讀取不一樣的 文本&#xff1a;讀: 遇到回車-換行(0D 0A)&#xff0c;就會轉換為換行符0A 寫&#xff1a;遇到換行符0A&#xff0c;就會轉換為回車-換…

軟件正向工程

正向工程是通過實現語言的映射而把模型轉換為代碼的過程。正向工程也稱為革新或改造&#xff0c;這項活動不僅從現有程序中恢復設計信息&#xff0c;而且使用該信息去改變或重構現有系統&#xff0c;以提高其整體質量。 換句話說&#xff1a;一般工業產品開發是從確定預期功能…

學成在線--2.CMS前端頁面查詢開發

文章目錄0.思路總結1.創建CMS模塊的目錄架構2.創建頁面并配置路由1&#xff09;在page目錄新建page_list.vue&#xff0c;擴展名為.vue。2&#xff09;在cms的router下配置路由。3&#xff09;在base目錄下的router導入cms模塊的路由3.使用Table組件完善頁面內容4.Api調用服務器…

java.util.IdentityHashMap.entrySet()方法實例

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 entrySet() 方法是用來獲取此映射中包含的映射關系的set視圖。 聲明 以下是java.util.IdentityHashMap.entrySet()方法的聲明。 publ…

URL轉微信可識別的二維碼

jquery.qrcode.js 是一個能夠在客戶端生成矩陣二維碼QRCode 的jquery插件 &#xff0c;使用它可以很方便的在頁面上生成二維條碼。 用法&#xff1a; 1、引入jquery.qrcode.min.js <script src"jquery.min.js"></script> <script src"jquery.qrc…

javascript數組及操作方法

數組及操作方法 數組就是一組數據的集合&#xff0c;javascript中&#xff0c;數組里面的數據可以是不同類型的。 定義數組的方法 //對象的實例創建 var aList new Array(1,2,3);//直接量創建 var aList2 [1,2,3,asd];操作數組中數據的方法 1、獲取數組的長度&#xff1a;aLi…