应根据需求选择提取方式:源码用正则或BeautifulSoup,渲染后DOM用开发者工具复制outerHTML,注意区分场景并处理嵌套、编码等问题。

直接保存整个网页的 <p> 标签内容,不能靠“另存为网页全部”——它会把所有资源打包,但不提取或过滤标签。你需要的是「提取 + 保存」两步动作,且必须区分「原始源码中的 <p>」和「渲染后 DOM 中的 <p>」。
用浏览器开发者工具复制当前渲染出的所有 <p> 标签
适用于页面经 JS 动态插入段落(比如新闻页、博客正文加载后才出现的 <p>):
- 按
F12打开开发者工具 → 切换到Elements面板 - 按
Ctrl+F(Windows)或Cmd+F(Mac),输入<p定位第一个<p>节点 - 在 DOM 树中按住
Shift多选连续的<p>节点,右键 →Copy→Copy outerHTML - 粘贴进 VS Code 或记事本,手动补上
<html><body>...</body></html>结构再保存为paragraphs.html - ⚠️ 注意:如果段落嵌套在
<div class="content">里,只复制<p>会丢失样式;此时应复制父容器的outerHTML,再用编辑器删掉非<p>内容
用正则表达式从 HTML 字符串中精准提取 <p> 标签块
适合你已拿到一整段 HTML 字符串(比如 API 返回值、爬虫抓取结果),只想保留成对的 <p> 及其内容:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- JavaScript 中可用:
text.match(/<p[^>]*>[\s\S]*?<\/p>/gi)—— 支持带属性(如<p class="intro">)和跨行文本 - Python 中推荐用
re.findall(r'<p[^>]*>.*?</p>', html_str, re.DOTALL | re.IGNORECASE) - ❌ 不要用
/<p>.*?<\/p>/g这种简单写法:遇到<p><em>hello</em></p>会因<em>中的<提前截断 - ✅ 更健壮的匹配逻辑是:开头
<p+ 任意非>属性字符 +>+ 中间允许任意字符(含换行)+ 结尾</p>
用 BeautifulSoup 稳定提取并结构化保存 <p> 文本
当 HTML 结构混乱、有嵌套、缺闭合标签,或你需要进一步清洗(去空格、合并相邻段落、过滤广告段落),BeautifulSoup 是更可靠的选择:
立即学习“前端免费学习笔记(深入)”;
- 安装:
pip install beautifulsoup4 - 基础提取:
from bs4 import BeautifulSoup
html = "<p>第一段</p><div><p>第二段</p></div>"
soup = BeautifulSoup(html, "html.parser")
ps = soup.find_all("p")
for p in ps:
print(p.get_text(strip=True)) # 输出纯文本,自动清理空白- 保存为独立文件时,建议用
str(p)保留原始 HTML,或用p.get_text()存纯文本;避免直接拼接字符串,防止编码错乱 - ⚠️ 常见坑:没指定解析器(如
"html.parser"或"lxml")会导致某些嵌套<p>被忽略或错位闭合
真正难的不是“怎么拿到 <p>”,而是判断该用哪一层提取逻辑:源码里的?渲染后的?带样式的?还是只要文字?多数人卡在第一步没想清这个,后面就全偏了。


















