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

Python爬虫:如何保留字符串中的\n换行字符?

解决BeautifulSoup爬取时保留换行符的问题

嘿,我明白你的问题了——当你用BeautifulSoup的get_text()方法时,它默认会把所有连续的空白(包括换行、多空格)都合并成单个空格,所以你看不到原内容里的\n\n这类换行符,而是直接显示成换行效果。别担心,有几个简单的方法能解决这个问题:

方法一:利用get_text()的separator参数+正则处理

get_text()有个separator参数,我们可以把它设为'\n',这样每个文本节点之间会用换行分隔,避免空白被合并。之后再用正则把多余的换行整理成你想要的格式:

import re
from bs4 import BeautifulSoup

# 假设你已经完成页面解析得到soup对象
raw_text = soup.body.get_text(separator='\n')
# 将连续的多个换行(包括中间夹杂空白的情况)替换为两个换行
formatted_text = re.sub(r'\n\s*\n', '\n\n', raw_text)

# 打印实际换行效果
print(formatted_text)
# 如果想在输出中看到明确的\n字符,用repr()
print(repr(formatted_text))

这样处理后,原内容里的空两行就会被保留成\n\n,打印时要么显示实际换行,要么显示转义后的\n符,完全符合你的需求。

方法二:手动遍历节点精准控制换行

如果页面的排版标签(比如<p>、<br>)很规范,你可以手动遍历节点,根据标签类型添加换行,这种方式更灵活:

from bs4 import BeautifulSoup

def extract_text_with_breaks(element):
    text_segments = []
    for node in element.descendants:
        # 遇到代表换行/段落的标签时添加换行
        if node.name in ('br', 'p', 'div'):
            text_segments.append('\n')
        # 处理文本节点,去掉前后空白后加入列表
        elif isinstance(node, str):
            stripped = node.strip()
            if stripped:
                text_segments.append(stripped)
    # 合并所有片段,过滤空内容
    return '\n'.join(seg for seg in text_segments if seg)

text = extract_text_with_breaks(soup.body)
print(text)
print(repr(text))

你可以根据目标页面的实际标签调整node.name里的内容,确保换行逻辑完全匹配页面结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:27:49