如何获取BeautifulSoup标签的所有直接子节点?有无更简洁实现方式?
嘿,这个需求其实BeautifulSoup已经给我们准备了超简洁的实现方式,根本不用绕弯子找兄弟节点~
最直接的方案:用find_all的recursive参数
BeautifulSoup的find_all方法有个recursive参数,默认是True(会递归查找所有子节点),把它设为False,就能只获取当前标签的直接子标签,完全符合你的需求:
from bs4 import BeautifulSoup html = """<div class='body'><span>A</span><span><span>B</span></span><span>C</span></div>""" soup = BeautifulSoup(html, 'html.parser') # 先定位到目标div target_div = soup.find('div', class_='body') # 非递归获取所有直接子标签 direct_child_tags = target_div.find_all(True, recursive=False) # 验证结果 for i, tag in enumerate(direct_child_tags, 1): print(f"block{i} : {tag}")
运行后会输出你想要的三个块:
block1 : A
block2 : B
block3 : C
另一种简洁写法:遍历children并过滤
如果你喜欢列表推导式,也可以直接遍历目标标签的children属性,过滤掉非标签类型的节点(比如空白字符串节点):
direct_child_tags = [child for child in target_div.children if isinstance(child, Tag)]
这个效果和上面的方法完全一致,而且代码同样清爽。
对比你当前的实现,这两种方式都直接针对目标div的直接子节点操作,逻辑更清晰,也避免了手动处理兄弟节点的繁琐和潜在错误~
内容的提问来源于stack exchange,提问作者wsdfgfkdl
相关产品推荐
相关产品推荐

