先用语义化容器缩小范围,再删除干扰节点,最后调用get_text()——这三步缺一不可:优先找<main>、<article>或含content/post等类名的<div>,再decompose掉script、style等非文本标签,最后get_text(separator="\n", strip=True)提取干净正文。

用 BeautifulSoup 定位或再调用 get_text()
get_text()多数现代网页把正文放在 <main>、<article> 或带 content/post 类名的 <div> 里。硬通货是先缩小范围,再提取——否则 get_text() 会把页脚导航、侧边栏广告全拖进来。
常见写法:
soup.find("main") or soup.find("article") or soup.find("div", class_=re.compile(r"content|post|entry|body"))- 结构固定时直接用 CSS 选择器:
soup.select_one("div.dnevnik-lesson__task") - 提取时加参数控制格式:
.get_text(separator="\n", strip=True),separator="\n"让段落间有换行,strip=True去首尾空格
提取前必须 decompose() 干扰标签
即使选对了父容器,里面仍可能混着 <script>、<style>、<nav>、<header>、<footer>、<aside> 这些非文本节点,它们的 get_text() 结果会污染输出。
正确做法是提取前批量销毁:
立即学习“前端免费学习笔记(深入)”;
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
for tag in soup(["script", "style", "nav", "header", "footer", "aside"]): tag.decompose()- 别用
extract()——它返回被移除节点,容易误留引用;decompose()更彻底,连节点对象都销毁 - 图标类标签(如
<i class="icon-download"></i>)无文本,不影响get_text(),不用管
中文乱码?先设 response.encoding 再解析
中文提取失败,90% 是编码没对齐。requests 默认按 ISO-8859-1 解码,一读就变 “文本”。
关键操作顺序不能错:
- 拿到
response后立刻设编码:response.encoding = response.apparent_encoding or "utf-8" - 若仍乱码,检查
response.headers.get("content-type")是否含charset=gbk,优先采用它 - 本地读 HTML 文件时,显式指定
encoding="utf-8"或encoding="gbk",别依赖系统默认
为什么不用 document.body.innerText 或正则?
浏览器控制台跑 document.body.innerText 看起来快,但它依赖页面已完整渲染 + JS 执行完毕;而服务端解析 HTML 字符串时,JS 根本没运行,结果天差地别。
正则更危险:
-
re.sub(r"<.*?>", "", html_str)会吃掉注释里的文本、破掉 CDATA 区块 - 无法处理自闭合标签(如
<img/>)、嵌套结构(<div><p>text</p></div>) - 遇到 JS 注入内容(如
document.write("<p>xxx</p>"))完全失效
真正稳定的做法是:先用语义化容器缩小范围,再删干扰节点,最后调用 get_text()——这三步缺一不可,少一步就容易漏正文或混进菜单。


















