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

如何用BeautifulSoup将所有HTML标签(含嵌套)单独存入字典?

解决BeautifulSoup解析HTML时单独存储所有嵌套标签的问题

嘿,我完全懂你的需求——你不想把父标签里的嵌套内容当成一个整体塞进字典,而是要让每一个标签(不管它嵌套在多少层下面)都作为独立的条目存进去,对吧?我之前也遇到过类似的需求,用递归遍历的方法就能完美解决。

先给你看一个实用的实现,假设你的HTML是这样的:

<html>
  <body>
    <div class="content">
      <h2>示例标题</h2>
      <p>这是一段包含<span>嵌套标签</span>的段落</p>
      <ul>
        <li>列表项1</li>
        <li>列表项2</li>
      </ul>
    </div>
  </body>
</html>

下面是对应的Python代码,用BeautifulSoup递归遍历所有标签并构建字典:

from bs4 import BeautifulSoup

def flatten_tags_to_dict(soup):
    tag_dict = {}
    
    def traverse_element(element):
        # 只处理有名称的标签元素,跳过纯文本节点
        if not element.name:
            return
        
        tag_name = element.name
        # 获取当前标签的文本(自动去除多余空格)
        tag_text = element.get_text(strip=True)
        # 可以加上标签属性,按需取舍
        tag_data = {
            'text': tag_text,
            'attributes': element.attrs
        }
        
        # 处理同名标签:如果已经存在,转为列表存储多个实例
        if tag_name in tag_dict:
            if not isinstance(tag_dict[tag_name], list):
                tag_dict[tag_name] = [tag_dict[tag_name]]
            tag_dict[tag_name].append(tag_data)
        else:
            tag_dict[tag_name] = tag_data
        
        # 递归遍历当前标签的所有子标签
        for child in element.children:
            traverse_element(child)
    
    # 从根节点开始遍历整个HTML结构
    traverse_element(soup)
    return tag_dict

# 解析示例HTML
html_content = """
<html>
  <body>
    <div class="content">
      <h2>示例标题</h2>
      <p>这是一段包含<span>嵌套标签</span>的段落</p>
      <ul>
        <li>列表项1</li>
        <li>列表项2</li>
      </ul>
    </div>
  </body>
</html>
"""

soup = BeautifulSoup(html_content, 'html.parser')
result_dict = flatten_tags_to_dict(soup)
print(result_dict)

代码说明:

  • 递归遍历:traverse_element函数会遍历每个标签,包括嵌套在深层的子标签,确保没有遗漏任何一个标签。
  • 同名标签处理:如果HTML中有多个同名标签(比如示例里的两个<li>),会自动把它们放进列表里,避免字典键冲突。
  • 灵活扩展:我在tag_data里加入了标签属性,如果不需要的话,直接只存文本就行,修改起来很方便。

运行这段代码后,你会得到这样的字典结果(简化版):

{
  'html': {'text': '', 'attributes': {}},
  'body': {'text': '', 'attributes': {}},
  'div': {'text': '示例标题这是一段包含嵌套标签的段落列表项1列表项2', 'attributes': {'class': ['content']}},
  'h2': {'text': '示例标题', 'attributes': {}},
  'p': {'text': '这是一段包含嵌套标签的段落', 'attributes': {}},
  'span': {'text': '嵌套标签', 'attributes': {}},
  'ul': {'text': '列表项1列表项2', 'attributes': {}},
  'li': [
    {'text': '列表项1', 'attributes': {}},
    {'text': '列表项2', 'attributes': {}}
  ]
}

这样每个标签都单独存在字典里,完全符合你的需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:42:26