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网络爬虫开发实战
相关文章:
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…...
【学习笔记】头文件中定义函数出现重复定义报错
目录 错误复现原因解决方案inlinestatic 扩展参考 错误复现 现在有一个头文件 duplicate_define.h 和两个源文件 duplicate_define_1.cpp 和 duplicate_define_2.cpp。 两个源文件都引入了头文件 duplicate_define.h,且在各自的函数中调用了定义在头文件中的全局函…...
Java 中的零拷贝技术:提升性能的利器
Java 中的零拷贝技术:提升性能的利器 在现代高性能应用中,数据传输的效率至关重要。传统的 I/O 操作通常涉及多次数据拷贝,这会导致性能瓶颈。而零拷贝(Zero-Copy)技术通过减少数据拷贝次数,显著提升了 I/…...
JavaScript:基本语法
今天我要介绍的新知识点内容为:JavaScript的基本语法以及使用说明。 首先我们先了解一下JS(JavaScript简称)是什么以及怎么使用JS: 介绍:JavaScript(JS)是一门弱类型的语言,用于给HTML页面上添加动态效果…...
Matlab 三维时频图
1、内容简介 Matlab 202-三维时频图 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
MySQL中动态生成SQL语句去掉所有字段的空格
在MySQL中动态生成SQL语句去掉所有字段的空格 在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况。其中,去掉字段中的空格是一项常见的操作。当表中的字段数量较少时,我们可以手动编写 UPDATE 语句来处理。但如果表中包…...
NO.91十六届蓝桥杯备战|图论基础-图的存储和遍历|邻接矩阵|vector|链式前向星(C++)
图的基本概念 图的定义 图G是由顶点集V和边集E组成,记为G (V, E),其中V(G)表⽰图G中顶点的有限⾮空集;E(G)表⽰图G中顶点之间的关系(边)集合。若 V { v 1 , v 2 , … , v n } V \left\{ v_{1},v_{2},\dots,v_{n} …...
树、二叉树、二叉查找树、AVL 树及红黑树的深入解析
树、二叉树、二叉查找树、AVL 树及红黑树的深入解析 1 .树的基本知识1.1 树的定义1.2 基本术语和概念1.3 常见树的结构1.4 树的遍历(取决于什么时候访问根节点) 2 二叉树2.1 二叉树的定义2.2二叉树与度为2的树的区别2.3二叉树的性质2.4 二叉树分类 3 红黑…...
BUUCTF-web刷题篇(21)
30.hark world 判断注入类型: 输入1报错提示bool(false)可知是字符型的布尔注入(盲注) 尝试万能密码 1 or 11 已检测SQL注入,猜测某些关键词或者字符被过滤。 使用FUZZ字典爆破...
Linux 网络基础知识总结
Linux 网络基础知识总结 1. 计算机网络体系结构 • OSI七层模型 由国际化标准组织(ISO)制定,将网络通信分为七层: • 物理层:比特流传输(如网线、光纤)。 • 数据链路层:帧传输&am…...
Day 8 上篇:深入理解 Linux 驱动模型中的平台驱动与总线驱动
在 Linux 内核驱动模型中,设备与驱动的组织方式不是随意堆砌,而是基于清晰的分类逻辑进行架构设计的。最核心的架构基础是“设备模型”(Device Model),而在此模型之上,各类驱动通过“平台驱动模型”与“总线…...
如何启动spark
解决:spark的bin目录下,无法启动spark问题 [roothadoop7 sbin]# ./start-all.sh ./start-all.sh:行29: /root/install/spark-2.4.0-bin-hadoop2.7/sbin/spark-config.sh: 没有那个文件或目录 ./start-all.sh:行32: /root/install/spark-2.4.0-bin-hadoo…...
Java网络编程干货
1.网络编程是什么 了解 在Java语言中,我们可以使用java.net包下的技术轻松开发出常见的网络应用程序,从而把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统&#x…...
Java实现安卓手机模拟操作
文章目录 第一部分:安卓模拟操作基础1.1 安卓输入系统概述1.1.1 输入事件传递机制1.1.2 输入事件类型 1.2 模拟操作的核心类1.2.1 Instrumentation类1.2.2 KeyEvent类1.2.3 MotionEvent类 1.3 权限要求1.3.1 普通权限1.3.2 特殊权限 第二部分:基础模拟操…...
一文讲清楚PLC、运动控制卡、运动控制器
随着工业技术的发展,工业机器人应用越来越广泛,PLC也不再是简单的可编程逻辑控制器,各个品牌厂家都推出了自己的运动控制型PLC,来实现一些运动控制功能,与此同时,运动控制卡及运动控制器也在如火如荼地发展…...
蓝桥杯备战
#include<bits/stdc.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(0);return 0; } 输入输出加速 ios::sync_with_stdio(false) 作用: 禁用 C 和 C 标准流的同步,使 cin/cout 速度接近 scanf/printf。 适用性ÿ…...
python保留关键字详解
一、什么是保留关键字? 保留关键字是Python语言中具有特殊含义和功能的词汇,这些词汇构成了Python的语法基础。它们不可被重新定义或用作变量名、函数名等标识符,在代码中承担着控制程序逻辑、定义数据结构等重要职责。 二、查看保留关键字…...
NLP中的“触发器”形式
在自然语言处理(NLP)中,触发器的设计更加依赖于文本特征,而非视觉特征。以下是NLP中常见的触发器类型及其实现方式: 1. 特定词汇或短语 定义:在文本中插入特定的单词、短语或符号。示例: 罕见…...
uView修改样式(持续更新)
场景 通过样式穿透修改uView2.0组件样式,用于app 注意版本不一样方法可能不同 实现 通用 .uni-body{line-height: 0; }u-input ::v-deep .u-input{height: 20.51rpx !important;padding: 0 6.59rpx !important; } ::v-deep .uni-input-input{height:50%;font-s…...
使用 Datadog 和 Slack Alerts 监控 AWS EC2
监控是大多数 IT 专业人员的关键职责之一。如果您最近正在寻找新工作,您可能已经注意到“监控”一词几乎出现在许多组织发布的每份职位描述中。 您可以找到各种监控工具,它们提供一些卓越的功能来简化您的工程工作。然而,Datadog 是大多数组…...
grafana/loki 部署搜集 k8s 集群日志
grafana/loki 和 grafana/loki-stack 的区别 Grafana 提供了多个 Helm Chart 用于在 Kubernetes 集群中部署 Loki 及相关组件,其中主要包括 grafana/loki 和 grafana/loki-stack。它们的主要区别如下: 1.grafana/loki Helm Chart: 专注于 Loki 部署: 该 Chart 专门…...
【ESP32S3】GATT Server service table传送数据到调试助手
前言 在初步学习esp32蓝牙的过程中,借鉴了官方的GATT Server Service Table Example,可以在readme中看到,此demo是采用低功耗蓝牙的通用属性服务器来创建订阅服务和特性。如果你接触过MQTT,你会发现GATT Server这一特性和MQTT的订…...
《Vue Router实战教程》5.嵌套路由
欢迎观看《Vue Router 实战(第4版)》视频课程 嵌套路由 一些应用程序的 UI 由多层嵌套的组件组成。在这种情况下,URL 的片段通常对应于特定的嵌套组件结构,例如: 通过 Vue Router,你可以使用嵌套路由配置…...
小白学习java第12天:IO流之转换流
我们可能会遇到这样情况就是:你在读取那个文件编码类型是GBK,而是进行读取的的时候使用的UTF-8,这就会导致乱码,因为你没办法保证别人是用什么类型进行编写的,因此我们就需要转换流进行处理这种情况! 下面…...
BERT - 直接调用transformers.BertModel, BertTokenizerAPI不进行任何微调
本节代码将使用 transformers 库加载预训练的BERT模型和分词器(Tokenizer),并处理文本输入。 1. 加载预训练模型和分词器 from transformers import BertTokenizer, BertModelmodel_path "/Users/azen/Desktop/llm/models/bert-base-…...
如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?
MyBatis 提供了 ExecutorType.BATCH 类型,允许将多个 SQL 语句进行组合,最后统一执行,从而减少数据库的访问频率,提升性能。 以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点: 1. 配置 MyBatis 使…...
传统门店VS智慧门店:电能物联网平台在连锁行业的节能应用
前言 随着连锁零售行业门店的规模化发展,能源消耗成为企业成本管控与可持续发展的重要课题。在当今快节奏的商业环境中,连锁门店的管理和运营变得越来越具有挑战性。能源数据是连锁门店的管理中重要组成部分,为了提高门店的能源利用效率和管…...
[ctfshow web入门] RCE 或(or)、异或(xor)、非(not)绕过
代码 这是一个python语言的,使用或(or)、异或(xor)、非(not)防火墙 这将根据命令提供加密后的指令,用法 rce_xor(list_cmd)、rce_or(list_cmd)、rce_not(list_cmd) 用来生成加密后的指令,这个指令是类如下面这样的,这些指令可以用…...
C++ 虚函数:深入理解多态的核心机制
C 虚函数:深入理解多态的核心机制 在 C 里,虚函数是实现 多态(Polymorphism) 的关键机制之一。透彻理解虚函数的概念、实现方式以及使用场景,对编写高效且可扩展的 C 代码起着至关重要的作用。本文会详细介绍 C 虚函数…...
速盾:高防CDN节点对收录有影响吗?
引言 搜索引擎收录是网站运营中至关重要的环节,它直接影响着网站的曝光度和流量。近年来,随着网络安全威胁的增加,许多企业开始采用高防CDN(内容分发网络)来保护其网站免受DDoS攻击和其他形式的网络攻击。然而&#x…...
按规则批量修改文件扩展名、删除扩展名或添加扩展名
文件的扩展名是多种多样的,有些不同文件的扩展名之间相互是可以直接转换的。我们工作当中最常见的就是 doc 与 docx、xls 与 xlsx、jpg 与 jpeg、html 与 htm 等等,这些格式在大部分场景下都是可以相互转换 能直接兼容的。我们今天要介绍的就是如何按照一…...
在Java项目中,引入【全局异常处理器】
目录 一.为什么引入全局异常处理器(目前项目碰到了什么问题)? 1.问题描述 2.与预期的差别 3.解决方案 二.解决上述问题 1.定义【业务异常类】 2.在serviceImpl层,手动抛出【违反唯一性约束】这个异常 3.定义【全局异常处理…...
计算机网络-TCP协议详解
TCP协议详解 2. TCP协议详解2.1 TCP协议概述2.1.1 TCP的历史背景2.1.2 TCP的设计目标2.1.3 TCP的基本特性2.1.4 TCP与其他传输协议的比较2.1.5 TCP的应用场景 2.2 TCP头部结构2.2.1 TCP头部格式2.2.2 TCP头部字段详解源端口号和目的端口号(各16位)序列号…...
[蓝桥杯 2023 省 A] 平方差
P9231 [蓝桥杯 2023 省 A] 平方差 题目描述 给定 L , R L,R L,R,问 L ≤ x ≤ R L \leq x \leq R L≤x≤R 中有多少个数 x x x 满足存在整数 y , z y,z y,z 使得 x y 2 − z 2 xy^2-z^2 xy2−z2。 输入格式 输入一行包含两个整数 L , R L,R L,Rÿ…...
隐私通信新时代:磐石云AXB平台如何重塑企业安全防线?
在数据泄露频发的当下,企业如何守护用户隐私?磐石云AXB隐私号平台以四大技术革新,构建通信安全堡垒。 技术突破: 动态号码隔离,隐私0泄露 AXB模式下,A与B的真实号码全程隐藏,仅通过虚拟号X中转…...
什么是八步工作法?
八步工作法,顾名思义,就是把一项工作拆分成八个步骤来完成。它的核心目的是让工作变得更有条理,更高效,避免忙而无序,做到事事有着落,件件有结果。这个方法在很多企业和单位中都有应用,尤其适合…...
日事清团队协作软件:智能制定计划,实时追踪任务进展,文件共享无缝协作,知识库一键沉淀成果
我们总是有微细目标,日事清可以帮助团队轻松共同制定计划、同步工作进展、共享工作资料、沉淀工作成果。 日事清具体如何帮助团队?你可以先了解以下这些基本功能模块。 从【计划】开始 在日事清中,【计划】是协同办公的开始,邀请…...
全球变暖(蓝桥杯 2018 年第九届省赛)
题目描述 你有一张某海域 NN 像素的照片,. 表示海洋、 # 表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. .......其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由…...
国际物流怎么找客户?选择适合自己的企业拓客平台
在国际物流行业,获客一直是企业发展的核心难题。无论是跨境电商、传统外贸,还是国际货代,找到精准的客户资源并高效转化,是决定企业能否抢占市场蓝海的关键。今天,我们就来聊聊如何选择一个真正适合的国际物流拓客平台…...
驱动-内核空间和用户空间数据交换
内核空间与用户控件数据交换 前面了解的字符设备中对 file_operations 结构体的进行了填充, 该 结构体的每一个成员都对应着一个系统调用, 例如 read、 write 等, 在字符设备相关的文章中有实验过对 调用函数进行了标志打印, 并没…...
智膳优选 | AI赋能的智慧食堂管理专家 —— 基于飞书多维表格和扣子(Coze)的智能解决方案
智膳优选 | AI赋能的智慧食堂管理专家 基于飞书多维表格和扣子(Coze)的智能解决方案 数据驱动餐饮管理,让每一餐都是营养与经济的完美平衡! “智膳优选”通过整合飞书与Coze,将数据智能引入校园餐饮管理࿰…...
FCOS目标检测
一、模型框架 FCOS采用的网络架构和RetinaNet一样,都是采用FPN架构,如图2所示,每个特征图后是检测器,检测器包含3个分支:classification,regression和center-ness。 对于特征图Fi∈RHWC,其相对…...
Linux中动态加载两个同名so(dlopen动态链接库)
// 当前路径下 ./test1.c int Func1(int a, int b) { return ab; } //编译生成so gcc -fPIC -shared -o libTest.so test1.c // 当前路径的test2文件夹中 ./test2/test2.c int Func1(int a, int b) { return a-b; } //编译生成同名so gcc -fPIC -shared -o …...
直播电商革命:东南亚市场的“人货场”重构方程式
一、人设经济3.0:从流量收割到情感基建 东南亚直播战场正经历从"叫卖式促销"到"沉浸式信任"的质变,新加坡市场成为最佳观察样本: 数据印证趋势:Shopee直播用户日均停留28分钟,超短视频平台&#…...
【CF】Day30——Codeforces Round 824 (Div. 2) C + Codeforces Round 825 (Div. 2) BC1
C. Phase Shift 题目: 思路: 好题,值得多看 这题我们看题目就能想到一个很显然的做法,那就是贪心地把每一个字母换成最前面的没使用过的字母 但是这样直接写是有问题的,因为题目说了最后要让所有的字母成一个换&…...
STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)
本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…...
SSRF打靶总结
文章目录 一. PortSwigger1、本地服务器的基本SSRF2、基本的目标不是漏洞机3、Referer标头的外带SSRF4、简单黑名单的SSRF黑名单绕过思路: 5、重定向的SSRF6. 简单的白名单SSRF白名单绕过思路: 二、BWAPP1. SSRF 文件包含漏洞 | 内网探测2. XXE -> S…...
第五章:5.1 ESP32物联网应用 - MQTT协议深度教程
一、MQTT协议简介 1.1 发布/订阅模式 MQTT(Message Queuing Telemetry Transport)是一种轻量级物联网通信协议,采用发布/订阅模式: 发布者(Publisher):发送消息到指定主题(如&…...
c++知识点
高级模板技术45: 模板元编程:这是一种在编译期进行计算和代码生成的技术。通过模板的递归展开、特化等操作,可以实现一些复杂的功能,例如编译期的计算、类型安全的容器等。例如,使用模板元编程可以实现一个编译期计算斐…...
【ChCore Lab 01】Bomb Lab 拆炸弹实验(ARM汇编逆向工程)
文章目录 1. 前言2. 实验代码版本问题3. 关于使用问题4. 宏观分析5. read_line 函数介绍6. phase_0 函数6.1. read_int 函数6.2. 回到 phase_0 函数继续分析6.3. 验证结果 7. phase_1 函数7.2. 验证结果 8. phase_2 函数8.1. read_8_numbers 函数8.2. 回到 phase_2 函数继续分析…...