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

如何用BeautifulSoup提取含<br>标签的<p>元素全部文本?

问题分析

你遇到的这个问题在BeautifulSoup使用中挺常见的——当<p>标签里嵌套了<br>这类子标签时,直接用.string提取文本会"卡"在第一个<br>前,本质原因是.string只能返回标签下单个连续文本节点的内容,一旦标签里有其他子元素(比如<br>),它要么返回None,要么只能抓取到第一个文本片段。

先还原你的场景(结合描述推测)

你的原始代码

from bs4 import BeautifulSoup

html = """
<p>这是第一行文本<br>这是被<br>截断的后续文本</p>
"""
soup = BeautifulSoup(html, 'html.parser')
p_tag = soup.find('p')
current_output = p_tag.string
print(current_output)

存在问题的HTML

<p>这是第一行文本<br>这是被<br>截断的后续文本</p>

当前代码输出

这是第一行文本

(部分版本的BeautifulSoup可能直接返回None)

期望输出

这是第一行文本这是被截断的后续文本

(或者保留换行格式:这是第一行文本\n这是被\n截断的后续文本)

解决方案:改用.get_text()方法

BeautifulSoup专门提供了.get_text()方法,它会递归提取目标标签下所有子节点的文本内容,完全不受<br>或其他子标签的影响。你还能根据需求指定分隔符,灵活处理<br>带来的换行效果:

修改后的代码

from bs4 import BeautifulSoup

html = """
<p>这是第一行文本<br>这是被<br>截断的后续文本</p>
"""
soup = BeautifulSoup(html, 'html.parser')
p_tag = soup.find('p')

# 方案1:直接拼接所有文本(无分隔符)
desired_output_1 = p_tag.get_text()
print(desired_output_1)
# 输出:这是第一行文本这是被截断的后续文本

# 方案2:用换行符替换<br>位置,保留原排版逻辑
desired_output_2 = p_tag.get_text(separator='\n')
print(desired_output_2)
# 输出:
# 这是第一行文本
# 这是被
# 截断的后续文本

# 方案3:用空格分隔,避免文本生硬拼接
desired_output_3 = p_tag.get_text(separator=' ')
print(desired_output_3)
# 输出:这是第一行文本 这是被 截断的后续文本

原理说明

.get_text()会遍历目标标签下的所有子节点(包括文本节点、<br>标签等),自动跳过标签元素,只提取其中的文本内容,再按照你指定的分隔符拼接(默认无分隔符)。而.string仅适用于标签下只有纯文本、没有任何子元素的简单场景,遇到嵌套结构就会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:56:16