正确做法是用正则一次删除所有及其闭合标签:Notepad++中启用正则、不勾“匹配新行”,查找]*>和分别替换为空;BeautifulSoup提取需用get_text(separator='\n');Scrapy中应直接用p::text伪类。

用 Notepad++ 批量删
标签,别碰 <.></.>
直接搜 <p></p> 和
<p>]*></p> 和 —— 注意不是 <.></.>,那个会跨行吞内容,尤其在 <p class="x">\n文本</p> 里直接崩掉。操作要点:
- 打开
Ctrl+H,勾选「正则表达式」,**不勾「匹配新行」** - 查找框填
<p>]*></p>,替换框留空 → 全部替换 - 再查
,同样留空替换 - 如果原文有
<p id="intro"></p>这类带属性的,[^>]*能安全匹配,不会误吞中间的"或=
Python 里用 BeautifulSoup 提取段落文本,get_text() 默认不认换行
写 soup.find('p').get_text() 看似没问题,但结果常是“第一段第二段第三段”粘成一团。因为 get_text() 默认用空格连接相邻文本节点,对中文、列表、标题完全不友好。
必须加参数:
立即学习“前端免费学习笔记(深入)”;
-
soup.find('p').get_text(separator='\n', strip=True)→ 段落间至少换行 - 若要保留多个
<p></p>之间的空行,用separator='\n\n',但得先soup.br.decompose()清掉冗余换行符 - 遇到
<p>Hello <strong>World</strong></p><div class="aritcle_card flexRow"> <div class="artcardd flexRow"> <a class="aritcle_card_img" href="/xiazai/skill10246" title="HTML Text Extract"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20dee630206.jpg" alt="HTML Text Extract" ></a> <div class="aritcle_card_info flexColumn"> <a href="/xiazai/skill10246" title="HTML Text Extract">HTML Text Extract</a> <p>从HTML页面(URL、文件或标准输入)中提取主体内容文本,去除导航、页脚、广告和模板文本。可直接传递给readability_check或其他文本工具。</p> </div> <a href="/xiazai/skill10246" title="HTML Text Extract" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>,.string会返回None,只能用.get_text()或''.join(p.stripped_strings)
Scrapy 中提取 <p></p> 内纯文本,::text 不是可选项而是必选项
response.css('p').get() 返回的是 <p>内容</p> 整个字符串,不是“内容”。网上很多教程教你在后面接 .replace(/]*>/g, ''),这在 Scrapy 里纯属多此一举且易错。
真正该写的是:
-
response.css('p::text').get()→ 取第一个直接文本子节点(不含子标签) -
response.css('p::text').getall()→ 得到['Hi', ' there']这种分段结果,适合处理<p>Hi <em>there</em></p> - 如果某
<p></p>下没直接文本(比如只有<img alt="HTML段落标签怎么批量删除?文本提取实用技巧" >),::text会返回空列表,需用.get(default='') or .getall() or next(..., '')防崩
删完 <p></p> 后文本还是乱?真正麻烦的是块级语义丢失
删标签只是第一步。真实 HTML 里,<p></p>、<h2></h2>、<li> 的换行和缩进不是靠标签本身,而是浏览器渲染逻辑。你删光了,就只剩 DOM 节点顺序 —— <h2>标题</h2>
<p>正文</p> 变成“标题正文”,中间毫无间隔。
所以批量清理后必须补一步结构感知处理:
- 用
soup.find_all(['h1','h2','p','li'])按语义分类,再逐个.get_text(strip=True) - 对
h2前缀加##,p加\n,li加-,手动重建轻量格式 - 含
<table> 的页面,<code>get_text()会把整行挤成一串,必须单独遍历tr和td - JS 动态插入的内容(如
document.getElementById('content').innerText = 'xxx')根本不在原始 HTML 字符串里,BeautifulSoup 拿不到,这点最容易被忽略


















