BeautifulSoup.get_text()可快速提取HTML纯文本,但需注意默认压缩空白、提取script/style内容等问题;应先移除无关标签,再用separator和strip参数优化输出;定位具体正文区域比直接body.get_text()更可靠;动态内容需Selenium渲染后获取;中文页面需额外处理乱码与空白符。

用 BeautifulSoup.get_text() 快速提取纯文本
大多数时候,你不需要全文清洗或结构还原,只要把 HTML 里的文字捞出来就行。BeautifulSoup 的 get_text() 是最直接的选择,它会递归遍历所有子节点,把标签全剥掉,只留文字内容。
注意两点:一是默认会把换行、空格全压成一个空格;二是遇到 <script></script> 或 <style></style> 也会一并提取——这通常不是你想要的。
- 加参数
strip=True自动去除每段首尾空白 - 用
separator="\n"让不同块之间换行,保留基本段落感 - 提前删掉脚本和样式:
soup.find('script').decompose()、soup.find('style').decompose()
示例:
from bs4 import BeautifulSoup
html = "<p>Hello</p><script>alert(1)</script><div>World</div>"
soup = BeautifulSoup(html, "html.parser")
for tag in soup(['script', 'style']):
tag.decompose()
print(soup.get_text(separator="\n", strip=True))
提取正文时为什么 body.get_text() 不够用
很多人以为 soup.body.get_text() 就能拿到“页面正文”,但现实是:很多网页的 <body> 里塞满了导航栏、侧边栏、页脚、广告 div,这些也属于 body 的子元素,get_text() 一视同仁全给你吐出来。
立即学习“前端免费学习笔记(深入)”;
真正的问题不是“怎么取文本”,而是“从哪一块 DOM 取”。如果你知道目标区域有固定 class(比如 class="article-content"),就该直接定位它:
- 用
soup.find(class_="article-content")或soup.select_one(".article-content") - 再调
.get_text(),比对整个body干净得多 - 如果 class 名不统一,可尝试找语义化标签:
soup.article、soup.main、soup.find("section", role="main")
别硬扛“通用性”——90% 的业务场景里,你面对的是有限几个模板,写几条针对性选择器比调参更稳。
遇到 JavaScript 渲染内容,get_text() 直接失效
如果目标文本是通过 AJAX 加载、或者由 React/Vue 动态插入的,requests + BeautifulSoup 拿到的原始 HTML 里根本没那部分 DOM,get_text() 再准也没用。
这时候不能靠解析静态 HTML,得让浏览器真把页面跑起来:
- 用
Selenium启动 Chrome/Firefox,driver.get(url)加载完整页面 - 等关键元素出现:
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, "content"))) - 再取
driver.find_element(By.CLASS_NAME, "content").text—— 这个.text是渲染后的真实文本
代价是启动慢、资源占用高,但这是动态内容的硬门槛。别想着用 requests 加 headers 模拟绕过去,现代前端早就不吃这套了。
中文页面要特别防乱码和空格塌陷
HTML 里中文混着空格、全角符号、 很常见,get_text() 默认处理不了这些细节,容易导致段落粘连或断句错乱。
建议在 get_text() 后加一层清洗:
- 把
替换成普通空格:text.replace(" ", " ") - 合并连续空白符:
re.sub(r"\s+", " ", text) - 去掉开头结尾不可见字符:
text.strip("\u200b\u200c\u200d\ufeff")(零宽字符、BOM)
另外,BeautifulSoup 初始化时务必指定编码,尤其是读本地文件:open("page.html", encoding="utf-8"),否则中文大概率变 。



















