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

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











