最稳方案是Python+BeautifulSoup的get_text(),因它能解析DOM、处理实体编码、跳过script/style、合并空白并支持隐藏内容过滤;而正则删标签仅适用于简单静态HTML,无法应对JS渲染、属性嵌套及 malformed 结构。

直接删标签不等于得到可用纯文本——HTML 里有隐藏文字、JS 渲染内容、 、<br>、注释、CDATA,还有 <script></script> 和 <style></style> 里的干扰内容。真要“无格式保存”,得先分清你手上的 HTML 是静态文件、浏览器里已渲染的页面,还是内存中的字符串。
用浏览器右键“查看源代码”后另存为,得到的是原始 HTML,不是纯文本
这个操作保存的是带完整标签的源码文件(.html),不是 .txt。它连 <script> 和 <style> 都原样保留,根本没做任何清洗。如果你只是想快速存一份可读文字,这步走错了方向。
- 适用场景:需要离线查看网页结构、调试或二次编辑 HTML
- 错误预期:以为“源代码”=“纯文本”
- 风险点:文件里大量
、、注释块 <code><!-- ... -->全部照搬,粘贴到 Word 或记事本里会显示一堆乱码符号
Notepad++ 用正则 <[^>]*> 批量删标签,只适合简单静态 HTML
这是最常被推荐、也最容易翻车的方法。它能干掉 <p>、<div> 这类闭合标签,但对以下情况完全失效:
-
<img alt="a < b">—— 属性值里的<会被误判为标签开头,导致整段错乱 -
<script>document.write("<p>Hello</p>")</script>—— 正则不会执行 JS,也就拿不到最终渲染出的Hello -
<pre><code>for (let i < 10; i++) {...}</code></pre>—— 代码块里的小于号全被删光,语义破坏
真正安全的写法是:<(?!(?:br|hr|img|meta|link|input)[>\s])[^>]*>(排除自闭合标签),但依然无法解决 JS 渲染问题。
立即学习“前端免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
Python + BeautifulSoup 的 get_text() 是目前最稳的通用方案
它模拟浏览器解析流程,跳过 <script></script> 和 <style></style>,合并连续空白,处理实体编码,并尊重 CSS display: none 等隐藏逻辑(需配合 lxml 解析器)。哪怕面对含 AJAX 加载内容的页面,只要 HTML 字符串本身已含渲染结果,就能准确提取。
最小可用示例:
from bs4 import BeautifulSoup
<p>with open("page.html", encoding="utf-8") as f:
soup = BeautifulSoup(f, "lxml")
print(soup.get_text())
-
get_text(separator=" ", strip=True):控制段落间空格/换行,避免文字粘连 - 如果 HTML 来自 requests 抓取,注意响应编码:
r.encoding = r.apparent_encoding - 遇到 malformed HTML(如嵌套错乱的
<b><i>text</b></i>),lxml 比 html.parser 更容错
动态页面必须先获取渲染后 HTML,再转纯文本
直接保存“查看源代码”或 requests.get(url).text,拿到的往往是空 <div id="app"></div>。这时候删标签毫无意义——因为真正文字还没生成。
- 正确路径:用 Selenium / Playwright 加载页面 →
driver.page_source或page.content()→ 再丢给 BeautifulSoup 处理 - 轻量替代:Chrome DevTools → Elements 面板右键
<html>→Copy outerHTML→ 粘贴进 Python 脚本处理 - 命令行快捷法(Linux/macOS):
curl -s URL | w3m -dump,但不支持 JS,且中文可能乱码
最常被忽略的一点:所谓“无格式”,不是简单删除标签,而是决定哪些内容该保留(如 <title> 文本)、哪些该丢弃(如 <noscript>)、哪些该规范化(如把 换成空格、<br> 换成换行)。不同来源的 HTML,清洗策略必须差异化对待。


















