关于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
相关产品推荐
相关产品推荐

