python小小白哟 发表于 2023-7-4 16:39:45

python中pyquery库的fin和children

pyquery库的fin和children意思是,find查找的是所有子节点,而children查找的是子节点,二者有什么区别呢?
下面的代码:
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)
items = doc('.list')
print(items)
lis = items.find('li')
print(lis)
lis = items.children()
print(lis)

打印结果如下:
<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>

<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>

<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>


那到底find和children有什么本质区别呢?因为输出的内容find和children的结果是一致的。
能否给出一段代码例子,使用find和children浅显易懂的解释一下呢?

陶远航 发表于 2023-7-4 16:40:06

本帖最后由 陶远航 于 2023-7-4 16:43 编辑

find()和children()是pyquery库中的两个方法,用于在HTML文档中进行节点查找操作。

区别如下:
- find():find()方法用于查找所有符合条件的子孙节点。它会递归地搜索目标节点下的所有子节点、孙节点以及更深层级的后代节点,并返回一个包含所有符合条件的节点的结果集。
- children():children()方法用于查找直接子节点。它仅会查找目标节点的直接子节点,不会继续向下搜索更深层级的节点,并返回一个包含所有直接子节点的结果集。

在你提供的代码例子中,items代表的是选取了.list类的元素,这里就是<ul class="list">节点。下面是对应的解释:

使用find()方法查找所有子孙节点

lis = items.find('li')
print(lis)

输出结果为:

<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>

使用children()方法查找直接子节点

lis = items.children()
print(lis)

输出结果为:

<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>


在这个例子中,由于.list元素下直接包含了所有的<li>子节点,因此使用find()和children()方法都返回了相同的结果。但如果在.list下还存在更深层级的标签,如<div>等,那么两者的结果将会不同,因为find()方法会继续向下搜索并返回更深层级的后代节点。

总结起来,find()方法用于查找目标节点及其后代节点,而children()方法仅查找目标节点的直接子节点。

isdkz 发表于 2023-7-4 16:41:19

find()和children()都是pyquery库中用于查找子节点的方法,但它们有一些本质的区别。

find()方法是用于查找当前节点下所有符合条件的子孙节点。它会递归地查找当前节点下的所有子节点、子节点的子节点,以此类推,直到找到符合条件的节点或者没有更多的子节点为止。find()方法返回的是一个包含所有符合条件的节点的pyquery对象。

children()方法是用于查找当前节点的直接子节点。它只会查找当前节点的一级子节点,不会继续往下查找子节点的子节点。children()方法返回的是一个包含当前节点的直接子节点的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>

<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>

<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>


从输出结果可以看出,find('li')和children()的结果是相同的,都是返回了所有的li节点。这是因为给定的代码中的items对象是一个包含所有li节点的pyquery对象,所以无论是使用find('li')还是children()都会返回相同的结果。

为了更好地理解find()和children()的区别,我们可以修改一下给定的代码,让items对象只包含一个li节点,然后分别使用find()和children()进行查找:

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)
items = doc('.list li:first-child')# 仅包含第一个li节点
print(items)

lis_find = items.find('li')# 使用find()查找子孙节点
print(lis_find)

lis_children = items.children()# 使用children()查找直接子节点
print(lis_children)


输出结果如下:

<li class="item-0">first item</li>

<li class="item-0">first item</li>



从输出结果可以看出,find('li')返回了所有的li节点,包括了当前节点和当前节点的子节点。而children()只返回了当前节点的直接子节点,即只返回了当前节点本身。

通过这个例子,我们可以清楚地看到find()和children()的区别:find()会递归地查找所有符合条件的子孙节点,而children()只会查找当前节点的直接子节点。

陶远航 发表于 2023-7-4 16:43:39

isdkz 发表于 2023-7-4 16:41
find()和children()都是pyquery库中用于查找子节点的方法,但它们有一些本质的区别。

find()方法是用于查 ...

你这不行啊
我比你快{:10_256:}

isdkz 发表于 2023-7-4 16:44:09

陶远航 发表于 2023-7-4 16:43
你这不行啊
我比你快

你不就是把间隔调小一点罢了

陶远航 发表于 2023-7-4 16:44:34

isdkz 发表于 2023-7-4 16:44
你不就是把间隔调小一点罢了

我3
你呢

isdkz 发表于 2023-7-4 16:45:42

陶远航 发表于 2023-7-4 16:44
我3
你呢

也是gpt3.5,gpt4很慢的

陶远航 发表于 2023-7-4 16:46:16

isdkz 发表于 2023-7-4 16:45
也是gpt3.5,gpt4很慢的

我说我的间隔是3

编程追风梦 发表于 2023-7-4 16:47:22

在pyquery库中,`find`和`children`都是用于在HTML文档中查找元素的方法,但它们有一些本质的区别。

`find(selector)`方法会在当前元素的所有子孙节点中查找匹配指定选择器的元素,并返回所有符合条件的元素。这意味着它会递归查找所有层级的子节点。在你的例子中,`items.find('li')`会返回`items`元素下的所有`li`元素,包括嵌套在`ul`中的`li`元素以及`li`元素内部的嵌套元素。

`children(selector)`方法则是用于查找当前元素的直接子节点,它只会查找当前层级下的子元素,不会继续向下递归查找子孙节点。在你的例子中,`items.children()`会返回`items`元素下的所有直接子元素,即`ul`元素下的`li`元素。

在输出结果中,你可以看到`find`和`children`方法返回的结果在这个特定的HTML结构中是相同的,因为所有的`li`元素都是`items`的直接子节点。然而,在其他的HTML结构中,这两个方法的结果可能会有所不同。

为了更好地理解它们的区别,考虑以下的HTML结构示例:

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>
      <ul>
      <li class="item-0">nested item</li>
      </ul>
    </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)
items = doc('.list')
print(items)
lis = items.find('li')
print(lis)
lis = items.children()
print(lis)


这次输出的结果将不同:

<ul class="list">
<li class="item-0">first item</li>
<li class="item-1">
    <a href="link2.html">second item</a>
    <ul>
      <li class="item-0">nested item</li>
    </ul>
</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


编程追风梦 发表于 2023-7-4 16:48:10

陶远航 发表于 2023-7-4 16:46
我说我的间隔是3

不是,7分钟了,我怎么还没检测到

sfqxx 发表于 2023-7-4 16:48:12

find和children都是pyquery库中用于查找元素的方法,它们在功能上有一些区别。

find()方法会在当前元素的所有子孙节点中进行查找,返回匹配指定选择器的所有元素。它会递归地查找到所有符合条件的子孙节点。例如,在你的代码示例中,items.find('li')会返回所有class为"list"的元素下的li标签,包括直接子节点和后代节点。

children()方法只会查找当前元素的直接子节点,返回匹配指定选择器的元素。它不会进一步查找子孙节点。对于你的代码示例,items.children()会返回class为"list"的元素下的直接子级li标签。

两者的区别在于查找范围的深度不同。find()方法会查找所有子孙节点,而children()方法只会查找直接子节点。

下面是一个使用find()和children()方法的代码示例:

from pyquery import PyQuery as pq

html = '''
<div class="container">
    <ul class="list">
      <li class="item">Item 1</li>
      <li class="item">Item 2</li>
      <li class="item">
            <a href="#">Item 3</a>
            <ul>
                <li class="sub-item">Sub Item 1</li>
                <li class="sub-item">Sub Item 2</li>
            </ul>
      </li>
    </ul>
</div>
'''

doc = pq(html)
container = doc('.container')

# 使用find查找所有子孙节点li
items = container.find('li')
print(items)

# 使用children查找直接子节点li
children = container.children('li')
print(children)

输出结果:

<li class="item">Item 1</li>
<li class="item">Item 2</li>
<li class="item">
    <a href="#">Item 3</a>
    <ul>
      <li class="sub-item">Sub Item 1</li>
      <li class="sub-item">Sub Item 2</li>
    </ul>
</li>

<li class="item">Item 1</li>
<li class="item">Item 2</li>
<li class="item">
    <a href="#">Item 3</a>
    <ul>
      <li class="sub-item">Sub Item 1</li>
      <li class="sub-item">Sub Item 2</li>
    </ul>
</li>

可以看到,使用find()方法返回了所有子孙节点li,而使用children()方法只返回了直接子节点li。

isdkz 发表于 2023-7-4 16:48:44

陶远航 发表于 2023-7-4 16:46
我说我的间隔是3



我之前试过被封过ip,所以我调的间隔比较大,而且随机{:10_250:}

陶远航 发表于 2023-7-4 16:48:49

编程追风梦 发表于 2023-7-4 16:48
不是,7分钟了,我怎么还没检测到

微信

陶远航 发表于 2023-7-4 16:49:29

isdkz 发表于 2023-7-4 16:48
我之前试过被封过ip,所以我调的间隔比较大,而且随机

哦...

python小小白哟 发表于 2023-7-4 16:54:44

isdkz 发表于 2023-7-4 16:41
find()和children()都是pyquery库中用于查找子节点的方法,但它们有一些本质的区别。

find()方法是用于查 ...

例子不对吧,例子里面有3个print,而输出结果只有2个。

isdkz 发表于 2023-7-4 16:56:46

python小小白哟 发表于 2023-7-4 16:54
例子不对吧,例子里面有3个print,而输出结果只有2个。

因为最后一个的结果为None,打印出来就是空的

python小小白哟 发表于 2023-7-4 17:25:19

sfqxx 发表于 2023-7-4 16:48
find和children都是pyquery库中用于查找元素的方法,它们在功能上有一些区别。

find()方法会在当前元素 ...

输出结果好像不对

sfqxx 发表于 2023-7-4 20:30:24

python小小白哟 发表于 2023-7-4 17:25
输出结果好像不对

哪里不对啦?说说看。
页: [1]
查看完整版本: python中pyquery库的fin和children