gne比beautifulsoup更适合通用新闻页,因其不依赖固定class或id,而是结合文本密度、标签分布、dom深度和语义位置加权判断,自动过滤script、style、footer、nav、评论区等噪声,并内置数百个中文新闻站适配规则,返回结构化dict结果。

直接用 GeneralNewsExtractor(GNE)最省事,对中文新闻站准确率高、开箱即用;BeautifulSoup.get_text() 适合结构清晰的自有站点或调试阶段,但得手动排除广告和侧栏;别碰正则提取正文——HTML嵌套和变体太多,re.findall(r'<p>(.*?)</p>', html) 这类写法在真实新闻页里基本失效。
为什么 GNE 比 BeautifulSoup 更适合通用新闻页
GNE 不依赖固定 class 或 id,而是结合文本密度、标签分布、DOM 层级深度和语义位置做加权判断。它内部会自动过滤掉:script、style、页脚 footer、导航 nav、评论区 div.comment 等典型噪声区域。
- 支持主流中文新闻源:今日头条、腾讯新闻、凤凰网、观察者网、游民星空等已内置适配规则
- 对含大量图片、微信公众号格式(如带
data-imgfileid的img标签)也能保留正文段落结构 - 返回结果是 dict,含
title、author、publish_time、content、images等字段,不用再拆解 - 不依赖浏览器环境,纯 Python 实现,可直接部署到服务器或批量处理本地 HTML 文件
用 BeautifulSoup 提取时必须加的三道过滤
如果你坚持用 BeautifulSoup(比如要兼容旧项目或做定制清洗),光调 soup.get_text() 是不够的。必须先做这三步清理:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 删掉所有
script、style、noscript、header、footer、nav标签:[tag.decompose() for tag in soup(['script', 'style', 'header', 'footer', 'nav'])] - 排除明显非正文的容器:用
soup.find_all('div', class_=re.compile(r'ad|sidebar|comment|widget|banner', re.I))找出后.decompose() - 只保留含较多文字的
p、section、article或顶级div:可按len(tag.get_text()) > 50粗筛,再按父级div的子p数量排序取 Top 1
get_text 分隔符不设对,正文就成一坨乱码
get_text() 默认把所有文本连成一串,中文里会粘连成“第一段第二段第三段”,完全不可读。必须显式传参:
- 用
separator='\n'保证每段p、h2、div各占一行 - 加
strip=True去掉每段首尾空格和换行,避免“\n\n 第一段 \n\n”这种残留 - 慎用
separator=' ':中文词间不需要空格,反而造成“军迷 们 欢 欣”式错误分词 - 如果后续要进 NLP 流程,建议先
get_text(separator='\n', strip=True),再按行切分,比用正则split(r'\n\s*\n')更稳
真正难的不是“怎么拿到文本”,而是“怎么定义哪段算正文”。GNE 内部做了上百个启发式规则,比如跳过含“广告”“赞助”“扫码关注”的段落,忽略连续出现 3 个以上 br 的区块——这些细节,自己重写一遍成本远高于 pip install gne。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










