【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.mzph.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…