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

如何让BeautifulSoup提取文本时忽略HTML原有的缩进与换行?

实现与prettify()反向的HTML文本提取方案

核心功能实现(基于BeautifulSoup)

BeautifulSoup完全可以满足你的需求,通过递归遍历文档树+空白处理就能实现和prettify()相反的效果,同时支持嵌套标签内容提取。

1. 提取无多余空白的纯文本

先获取HTML的所有文本内容,再清理掉冗余的换行、缩进和连续空格:

from bs4 import BeautifulSoup
import re

def get_clean_plain_text(html):
    soup = BeautifulSoup(html, "html.parser")
    # 用空格分隔所有文本节点,再替换所有连续空白为单个空格
    raw_text = soup.get_text(separator=" ")
    return re.sub(r"\s+", " ", raw_text).strip()

2. 递归提取指定嵌套标签的内容

自定义递归遍历函数,深度遍历文档树,遇到目标标签就提取其干净文本,适配任意嵌套层级:

def extract_target_tag_contents(html, target_tag):
    soup = BeautifulSoup(html, "html.parser")
    tag_contents = []

    def traverse_node(node):
        # 当前节点是目标标签,提取其干净文本
        if node.name == target_tag:
            tag_text = re.sub(r"\s+", " ", node.get_text()).strip()
            tag_contents.append(tag_text)
        # 递归遍历所有子标签节点
        for child in node.children:
            if hasattr(child, "children"):
                traverse_node(child)

    traverse_node(soup)
    return tag_contents

测试示例

用包含缩进、换行和多层嵌套的HTML测试:

<p>
  这是一段带换行和缩进的段落,
  包含<i>第一层斜体文本</i>,
  <div>
    嵌套div里还有<i>第二层嵌套的斜体内容</i>
  </div>
</p>

运行测试代码:

sample_html = """
<p>
  这是一段带换行和缩进的段落,
  包含<i>第一层斜体文本</i>,
  <div>
    嵌套div里还有<i>第二层嵌套的斜体内容</i>
  </div>
</p>
"""

# 提取干净纯文本
print(get_clean_plain_text(sample_html))
# 输出:这是一段带换行和缩进的段落,包含第一层斜体文本,嵌套div里还有第二层嵌套的斜体内容

# 提取所有<i>标签内容
print(extract_target_tag_contents(sample_html, "i"))
# 输出:['第一层斜体文本', '第二层嵌套的斜体内容']

补充说明

  • 空白处理用re.sub(r"\s+", " ", text),能统一处理换行、制表符、多个空格等所有冗余空白
  • 递归遍历逻辑会覆盖所有层级的嵌套标签,不管标签嵌套多深都能准确提取
  • 提取的标签内容可以直接传入pylatex的对应方法(比如Italic())生成LaTeX文档

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:15:01