鱼C论坛

 找回密码
 立即注册
查看: 930|回复: 17

[已解决]python中pyquery库的fin和children

[复制链接]
发表于 2023-7-4 16:39:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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: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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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()方法仅查找目标节点的直接子节点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 pqdoc = 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()只会查找当前节点的直接子节点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

你这不行啊
我比你快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:44:09 | 显示全部楼层
陶远航 发表于 2023-7-4 16:43
你这不行啊
我比你快

你不就是把间隔调小一点罢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:44:34 | 显示全部楼层
isdkz 发表于 2023-7-4 16:44
你不就是把间隔调小一点罢了

我3
你呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:45:42 | 显示全部楼层

也是gpt3.5,gpt4很慢的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:46:16 | 显示全部楼层
isdkz 发表于 2023-7-4 16:45
也是gpt3.5,gpt4很慢的

我说我的间隔是3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:48:10 | 显示全部楼层
陶远航 发表于 2023-7-4 16:46
我说我的间隔是3

不是,7分钟了,我怎么还没检测到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:48:44 | 显示全部楼层
陶远航 发表于 2023-7-4 16:46
我说我的间隔是3

Snipaste_2023-07-04_16-47-44.png

我之前试过被封过ip,所以我调的间隔比较大,而且随机
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:48:49 | 显示全部楼层
编程追风梦 发表于 2023-7-4 16:48
不是,7分钟了,我怎么还没检测到

微信
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:49:29 | 显示全部楼层
isdkz 发表于 2023-7-4 16:48
我之前试过被封过ip,所以我调的间隔比较大,而且随机

哦...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

例子不对吧,例子里面有3个print,而输出结果只有2个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 16:56:46 | 显示全部楼层
python小小白哟 发表于 2023-7-4 16:54
例子不对吧,例子里面有3个print,而输出结果只有2个。

因为最后一个的结果为None,打印出来就是空的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-4 17:25:19 | 显示全部楼层
sfqxx 发表于 2023-7-4 16:48
find和children都是pyquery库中用于查找元素的方法,它们在功能上有一些区别。

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

输出结果好像不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-4 20:30:24 | 显示全部楼层

哪里不对啦?说说看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-12 13:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表