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

