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

