必须先用beautifulsoup定位语义容器(如main/article或含content/post/entry类名的div)再调用get_text(separator="\n", strip=true),并提前decompose() script、style等干扰标签,同时设置response.encoding修复中文乱码;动态渲染内容需换用selenium或抓取api接口。

用 BeautifulSoup 定位语义容器再调用 get_text()
直接对整个 soup 调用 get_text() 会把导航栏、页脚、广告文案全拖进来,结果不可用。必须先缩小范围——正文几乎总在语义化容器里:main、article、或含 content/post/entry 类名的 div。
实操建议:
- 优先写:
soup.find("main") or soup.find("article") or soup.find("div", class_=re.compile(r"content|post|entry|body")) - 若目标站结构固定(比如教育平台的
div.dnevnik-lesson__task),直接用soup.select("div.dnevnik-lesson__task") - 拿到容器后,立刻加参数:
.get_text(separator="\n", strip=True)——separator="\n"让段落间有换行,strip=True去首尾空格,比默认输出干净得多
提取前必须 decompose() 干扰标签
即使选对了 main 或 article,里面还可能嵌着 script、style、nav、footer 这类节点,它们的文本内容(比如 JS 变量名、CSS 注释)会被 get_text() 一并吐出来,污染正文。
正确做法是提取前主动清除:
- 执行
for tag in soup(["script", "style", "nav", "footer", "header", "aside"]): tag.decompose() - 别用
extract()——它返回被删节点,内存不释放;decompose()更彻底,连节点对象都销毁 -
i、svg等纯图标标签无文本,不影响get_text(),不用额外处理
中文乱码?先 fix response.encoding
requests 默认按 ISO-8859-1 解码响应体,遇到没声明 charset 的中文网页,response.text 直接变 文本。这不是 BeautifulSoup 的问题,是编码层就错了。
关键一步必须做:
- 拿到
response后,**立刻**设编码:response.encoding = response.apparent_encoding or "utf-8" - 更稳妥的做法:检查
response.headers.get("content-type")是否含charset=gbk类信息,并优先采用它 - 不要硬写
encoding="utf-8"开文件——如果源 HTML 是 GBK 编码,本地读取时仍会乱码
动态渲染内容?别硬啃 HTML 源码
如果页面正文由 JavaScript 异步加载(比如 React/Vue 单页应用、评论区懒加载),requests + BeautifulSoup 拿到的 HTML 里根本没正文,此时所有 selector 和 get_text() 都白搭。
该换工具链:
- 用
Selenium或Playwright启动真实浏览器,等document.readyState === "complete"再取document.body.innerText - 或者直接抓接口:打开 DevTools → Network → 切 XHR/Fetch,找返回 JSON 的请求,正文常藏在
data.content或类似字段里 - 别用正则从原始 HTML 里“猜”正文——JS 注入后 DOM 结构和源码完全不一致,正则必漏必错
真正难的不是写几行 get_text(),而是判断:这个页面的正文是静态的还是动态的?编码声明是否可信?语义容器是否存在且稳定?这三个问题没理清,后面所有操作都在堆错误。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











