在项目中需要收集相关行业新闻,发现一种基于文本及符号密度的网页正文提取方法,准确率挺高,依赖又少,特别推荐。
这种方法是对论文《基于文本及符号密度的网页正文提取方法》的实现。如果你感兴趣,可以前往阅读论文原文 http://mag.ieechina.com/oa/pdfdow.aspx?Sid=201807113
这篇论文中描述的算法看起来简洁清晰,并且符合逻辑。里面一个比较有用的判断标准:
1
2
3
4
5
Ti - LTi
SbDi = --------------
Sbi + 1
SbDi: 符号密度
Sbi:符号数量
如果一个节点里面的文本的符号出现次数越多,符号密度SbDi的值就越小,但是文档里说会越大,如何解 ?
因为它这里考虑的是一个『合乎逻辑』的正文。而不是为了欺骗这个程序而特意构造的文本。在一篇正常的文章中,文章越长,标点符号就阅读,这是自然而然的情况。 而你可能以为,会不会有一篇新闻,里面某一个栏目没有汉字,直接写了几百个标点符号。这种情况当然可以欺骗这个程序,但是那属于『特意构造』出来的bad case。
在一篇正常的文章中,标点符号越多,那么正文的文字也就越多。分子分母同时增加。而显然,文字增长会比标点符号增长快,所以这个比值会变大。
根据 GNE 作者 kingname 的测试使用该算法对今日头条、网易新闻、游民星空、观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻做了测试,几乎能够达到100%的准确率。个人在使用中体验,只要合理添加 noise_node_list
,也能取到正文(除了一些SEO过度的页面)。
实现流程
算法实现
目前有python
与nodeJS
两个实现,依赖都很少
- python 实现 https://github.com/kingname/GeneralNewsExtractor
- nodeJS 实现 https://github.com/zenghongtu/general-news-extractor-js 根据 python 版实现
- GNE golang 版demo https://pylist.com/tools/gogne
python 版还提供了很实用的 noise_node_list
参数,可以根据实际页面排除无关内容。
功能限制
因为只针对新闻类网页作提取,如果要提取其它类型的内容可能不行,但可以尝试多添加过滤 XPath
试试。
在线版本
这里以在线版 https://pylist.com/tools/gne 说明使用过程
需要输入两个内容:
- 网页的 html 代码
- 过滤的 xpath
因为不提供爬虫功能,可以通过 Chrome 开发者工具的 Copy OuterHTML
获取页面 HTML 代码和 Copy XPath
来获取排除的元素。
使用 Copy OuterHTML 来复制整个网页 HTML 代码。
如果提取到的内容不是自己想要的,可以选择提取到的元素,点 Copy XPath
,然后粘贴到过滤 XPath ,可以是多个 XPath,用英文逗号 ,
来隔开。
输入效果
提取到新闻信息
- 标题
- 作者
- 发布日期
- 内容
- 图片列表
效果如下:
在线版测试 https://pylist.com/tools/gne 在线版提取到的图片可能会有防盗链功能,显示不了。
参考
本文网址: https://pylist.com/topic/194.html 转摘请注明来源
1 thoughts on "利用文本及符号密度来提取新闻网页正文"
我是GNE的作者,原本想做一个这样的在线测试页面,发现你已经先做了。请问有兴趣一起合作吗?