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

