You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于BeautifulSoup中children()与descendants()的输出差异问询

BeautifulSoup中.children和.descendants的输出差异

首先明确两个属性的核心定义:

  • .children:仅返回当前节点的直接子节点,不会递归进入子节点内部获取更深层级的内容
  • .descendants:会递归遍历当前节点所有层级的后代节点,包含直接子节点、子节点的子节点,直到最内层的文本、属性节点

1. 针对示例代码使用.children的输出内容

你遍历的是id="giftList"的表格节点的直接子节点,正常情况下表格的直接子节点只有<tr>行标签(包含表头行和所有商品数据行),以及行与行之间的换行符文本节点。输出的内容是完整的<tr>...</tr>结构,你能看到每个tr内部嵌套的td、img、span等内容,但这些属于tr的子节点,不会被单独拆分出来作为独立条目打印。

2. 针对示例代码使用.descendants的输出内容

遍历会逐层拆解所有嵌套节点:

  • 首先输出所有tr标签
  • 接着输出每个tr的直接子节点:td标签、tr内部的换行符
  • 再输出每个td的子节点:td内的文本、span标签、img标签
  • 最后输出span包裹的文本、img的属性内容等更内层的节点
    最终输出的条目数远多于.children的结果,和书中描述的二十多个标签的情况一致。

测试时无差异的可能原因

大概率是你直接打印全量内容时,.children输出的是完整tr结构,.descendants是把所有节点拆成独立条目逐个打印,最终拼接出来的整体文本看起来高度相似。你可以在循环里添加计数变量打印条目数,就能直观看到差异:

# 计数对比测试
count = 0
for child in bs.find('table',{'id':'giftList'}).children: 
    count +=1
print(f".children的条目数:{count}")

count = 0
for child in bs.find('table',{'id':'giftList'}).descendants: 
    count +=1
print(f".descendants的条目数:{count}")

正常运行后前者的计数仅为十几(主要是tr行加换行符),后者会达到二十多甚至更高,和书中描述完全吻合。

内容的提问来源于stack exchange,提问作者RabbitSF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:24:06