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

Python BeautifulSoup:如何将嵌套元素转为带缩进的文本

实现思路与代码示例

核心是通过递归遍历DOM节点跟踪<blockquote>的嵌套层级,从而为引用文本添加对应层级的缩进前缀。直接用get_text()会丢失结构信息,必须手动遍历节点区分类型。

具体步骤

  • 递归遍历目标内容的所有子节点,维护一个「当前引用层级」变量
  • 遇到普通文本节点:过滤无意义空白后,根据当前层级决定是否添加短横线前缀(仅处于<blockquote>内部时添加)
  • 遇到<blockquote>节点:将层级+1后递归处理其内部节点,处理完成后还原层级
  • 遇到其他块级元素(如<p>、<div>):保持层级不变,递归处理内部内容

代码实现

from bs4 import BeautifulSoup, NavigableString

def process_node(node, quote_level=0):
    result = []
    for child in node.children:
        if isinstance(child, NavigableString):
            # 过滤空白文本,仅保留有效内容
            text = child.strip()
            if text:
                # 根据引用层级生成前缀
                if quote_level > 0:
                    prefix = "-" * quote_level + " "
                    result.append(f"{prefix}{text}")
                else:
                    result.append(text)
        elif child.name == "blockquote":
            # 进入嵌套引用,层级+1后递归处理
            result.extend(process_node(child, quote_level + 1))
        else:
            # 其他元素保持层级不变,继续递归
            result.extend(process_node(child, quote_level))
    return "\n".join(result)

# 示例使用
html = """
<div class="post-content">
    这是普通正文内容
    <blockquote>
        这是第一层引用
        <blockquote>
            这是第二层嵌套引用
            <p>嵌套引用里的段落文本</p>
        </blockquote>
    </blockquote>
    正文继续
</div>
"""

soup = BeautifulSoup(html, "html.parser")
content = soup.find("div", class_="post-content")
processed_text = process_node(content)
print(processed_text)

输出效果

这是普通正文内容
- 这是第一层引用
-- 这是第二层嵌套引用
-- 嵌套引用里的段落文本
正文继续

补充说明

  • 可根据需求调整前缀格式,比如替换成空格缩进或「>」符号模拟论坛原生引用样式
  • 若需保留段落换行,可在处理<p>等块级元素时额外添加换行符
  • 针对复杂论坛结构,可对特定标签做针对性处理,避免文本粘连

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 10:59:55