鱼C论坛

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

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

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

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

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

x
pyquery库的fin和children意思是,find查找的是所有子节点,而children查找的是子节点,二者有什么区别呢?
下面的代码:
  1. html = '''
  2. <div id="container">
  3. <ul class="list">
  4. <li class="item-0">first item</li>
  5. <li class="item-1"><a href="link2.html">second item</a></li>
  6. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  7. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  8. <li class="item-0"><a href="link5.html">fifth item</a></li>
  9. </ul>
  10. </div>
  11. '''

  12. from pyquery import PyQuery as pq
  13. doc = pq(html)
  14. items = doc('.list')
  15. print(items)
  16. lis = items.find('li')
  17. print(lis)
  18. lis = items.children()
  19. 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()方法的代码示例:

  1. from pyquery import PyQuery as pq

  2. html = '''
  3. <div class="container">
  4.     <ul class="list">
  5.         <li class="item">Item 1</li>
  6.         <li class="item">Item 2</li>
  7.         <li class="item">
  8.             <a href="#">Item 3</a>
  9.             <ul>
  10.                 <li class="sub-item">Sub Item 1</li>
  11.                 <li class="sub-item">Sub Item 2</li>
  12.             </ul>
  13.         </li>
  14.     </ul>
  15. </div>
  16. '''

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

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

  22. # 使用children查找直接子节点li
  23. children = container.children('li')
  24. print(children)
复制代码


输出结果:

  1. <li class="item">Item 1</li>
  2. <li class="item">Item 2</li>
  3. <li class="item">
  4.     <a href="#">Item 3</a>
  5.     <ul>
  6.         <li class="sub-item">Sub Item 1</li>
  7.         <li class="sub-item">Sub Item 2</li>
  8.     </ul>
  9. </li>

  10. <li class="item">Item 1</li>
  11. <li class="item">Item 2</li>
  12. <li class="item">
  13.     <a href="#">Item 3</a>
  14.     <ul>
  15.         <li class="sub-item">Sub Item 1</li>
  16.         <li class="sub-item">Sub Item 2</li>
  17.     </ul>
  18. </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()方法查找所有子孙节点

  1. lis = items.find('li')
  2. print(lis)
复制代码

输出结果为:

  1. <li class="item-0">first item</li>
  2. <li class="item-1"><a href="link2.html">second item</a></li>
  3. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  4. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  5. <li class="item-0"><a href="link5.html">fifth item</a></li>
复制代码

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

  1. lis = items.children()
  2. print(lis)
复制代码

输出结果为:

  1. <li class="item-0">first item</li>
  2. <li class="item-1"><a href="link2.html">second item</a></li>
  3. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  4. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  5. <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对象。

在给出代码例子之前,我们先来看一下给定的代码中的输出结果:
  1. <ul class="list">
  2. <li class="item-0">first item</li>
  3. <li class="item-1"><a href="link2.html">second item</a></li>
  4. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  5. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  6. <li class="item-0"><a href="link5.html">fifth item</a></li>
  7. </ul>
  8. <li class="item-0">first item</li>
  9. <li class="item-1"><a href="link2.html">second item</a></li>
  10. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  11. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  12. <li class="item-0"><a href="link5.html">fifth item</a></li>
  13. <li class="item-0">first item</li>
  14. <li class="item-1"><a href="link2.html">second item</a></li>
  15. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  16. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  17. <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()进行查找:
  1. html = '''
  2. <div id="container">
  3. <ul class="list">
  4. <li class="item-0">first item</li>
  5. <li class="item-1"><a href="link2.html">second item</a></li>
  6. <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
  7. <li class="item-1 active"><a href="link4.html">fourth item</a></li>
  8. <li class="item-0"><a href="link5.html">fifth item</a></li>
  9. </ul>
  10. </div>
  11. '''
  12. from pyquery import PyQuery as pq
  13. doc = pq(html)
  14. items = doc('.list li:first-child')  # 仅包含第一个li节点
  15. print(items)
  16. lis_find = items.find('li')  # 使用find()查找子孙节点
  17. print(lis_find)
  18. lis_children = items.children()  # 使用children()查找直接子节点
  19. print(lis_children)
复制代码

输出结果如下:
  1. <li class="item-0">first item</li>
  2. <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结构示例:

  1. html = '''
  2. <div id="container">
  3.   <ul class="list">
  4.     <li class="item-0">first item</li>
  5.     <li class="item-1">
  6.       <a href="link2.html">second item</a>
  7.       <ul>
  8.         <li class="item-0">nested item</li>
  9.       </ul>
  10.     </li>
  11.     <li class="item-0 active">
  12.       <a href="link3.html"><span class="bold">third item</span></a>
  13.     </li>
  14.     <li class="item-1 active">
  15.       <a href="link4.html">fourth item</a>
  16.     </li>
  17.     <li class="item-0"><a href="link5.html">fifth item</a></li>
  18.   </ul>
  19. </div>
  20. '''
复制代码


使用相同的代码:

  1. from pyquery import PyQuery as pq
  2. doc = pq(html)
  3. items = doc('.list')
  4. print(items)
  5. lis = items.find('li')
  6. print(lis)
  7. lis = items.children()
  8. print(lis)
复制代码


这次输出的结果将不同:

  1. <ul class="list">
  2.   <li class="item-0">first item</li>
  3.   <li class="item-1">
  4.     <a href="link2.html">second item</a>
  5.     <ul>
  6.       <li class="item-0">nested item</li>
  7.     </ul>
  8.   </li>
  9.   <li class="item-0 active">
  10.     <a href="link3.html"><span class="bold">third item</span></a>
  11.   </li>
  12.   <li class="item-1 active">
  13.     <a href="link4.html">fourth item</a>
  14.   </li>
  15.   <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()方法的代码示例:

  1. from pyquery import PyQuery as pq

  2. html = '''
  3. <div class="container">
  4.     <ul class="list">
  5.         <li class="item">Item 1</li>
  6.         <li class="item">Item 2</li>
  7.         <li class="item">
  8.             <a href="#">Item 3</a>
  9.             <ul>
  10.                 <li class="sub-item">Sub Item 1</li>
  11.                 <li class="sub-item">Sub Item 2</li>
  12.             </ul>
  13.         </li>
  14.     </ul>
  15. </div>
  16. '''

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

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

  22. # 使用children查找直接子节点li
  23. children = container.children('li')
  24. print(children)
复制代码


输出结果:

  1. <li class="item">Item 1</li>
  2. <li class="item">Item 2</li>
  3. <li class="item">
  4.     <a href="#">Item 3</a>
  5.     <ul>
  6.         <li class="sub-item">Sub Item 1</li>
  7.         <li class="sub-item">Sub Item 2</li>
  8.     </ul>
  9. </li>

  10. <li class="item">Item 1</li>
  11. <li class="item">Item 2</li>
  12. <li class="item">
  13.     <a href="#">Item 3</a>
  14.     <ul>
  15.         <li class="sub-item">Sub Item 1</li>
  16.         <li class="sub-item">Sub Item 2</li>
  17.     </ul>
  18. </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-5-20 15:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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