网页正文提取.docx
- 文档编号:16658634
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:9
- 大小:513.77KB
网页正文提取.docx
《网页正文提取.docx》由会员分享,可在线阅读,更多相关《网页正文提取.docx(9页珍藏版)》请在冰点文库上搜索。
网页正文提取
我为开源做贡献,网页正文提取——Html2Article
2014-1-714:
38| 发布者:
红黑魂| 查看:
16722| 评论:
4|原作者:
StanZhai|来自:
博客园
摘要:
为什么要做正文提取一般做舆情分析,都会涉及到网页正文内容提取。
对于分析而言,有价值的信息是正文部分,大多数情况下,为了便于分析,需要将网页中和正文不相干的部分给剔除。
可以说正文提取的好坏,直接影响了分...
为什么要做正文提取
一般做舆情分析,都会涉及到网页正文内容提取。
对于分析而言,有价值的信息是正文部分,大多数情况下,为了便于分析,需要将网页中和正文不相干的部分给剔除。
可以说正文提取的好坏,直接影响了分析结果的好坏。
对于特定的网站,我们可以分析其html结构,根据其结构来获取正文信息。
先看一下下面这张图:
正文部分,不同的网站,正文所在的位置不同,并且Html的结构也不同,对于爬虫而言,抓取的页面是各种各样的,不可能针对所有的页面去写抓取规则来提取正文内容,因此需要一种通用的算法将正文提取出来。
现有的网页正文提取算法
∙基于标签用途的正文提取算法(比如title或h1,h2标签一般用作标题,p一般表示正文段落,根据标签的含义去提取正文)
∙基于标签密度判定(这个简单,说白了就是字符统计,正文部分html标签的密度比较低,确定一个阈值,按照标签密度提取正文部分)
∙基于数据挖掘思想的网页正文抽取方法(这里会涉及到统计学和概率论的一些知识,在高深点就成了机器学习了,没有深入研究)
∙基于视觉网页块分析技术的正文抽取(CV这种高端大气上档次的东西,岂是我等这么容易就能研究明白的。
虽然实现上复杂,但就提取效果而言,这种方法提取的精度还是不错的)
前2中方法还是比较容易实现的,主要是处理简单,先前我把标签密度的提取算法实现了,但实际用起来错误率还是蛮高的;后2种方法在实现上就略复杂了,从算法效率上讲应该也高不了哪去。
我们需要的是一种简单易实现的,既能保证处理速度,提取的准确率也不错的算法。
于是结合前两种算法,研究网页html页面结构,有了一种比较好的处理思路,权且叫做基于文本密度的正文提取算法吧。
后来从网上找了一下类似的算法,发现也有使用类似的处理方法来处理正文提取的,不过还是有些不同。
接下来跟大家分享一下这个算法的一些处理思想。
网页分析
我任意取了XX,搜狐,网易的一篇新闻类网页,拿来作分析。
先看一篇XX的文章
任正非为什么主动与我合影,
首先请求这个页面,然后过滤到所有的html标签,只保留文本信息,我们可以看到正文信息集中在一下位置:
使用Excel分析行数与每行的字符的关系可以发现:
很明显,正文内容集中在65-100行之间的位置上,而这个区间的字符数也是比较密集的。
再来一篇网易的文章
张小龙神话已破灭马化腾该接管微信了,
还是先看下过滤html标签后的正文部分:
再来一个Excel的分析结果:
正文部分集中在279-282行之间,从图上看,也正是这么几行的文本密度特别高。
最后分析一篇搜狐的新闻
李克强天津调研考察的几个瞬间,
还是先看下过后标签后的正文:
再看下Excel的分析结果:
而搜狐的这篇文章正文部分主要集中在200-255行之间。
其余的文本全部是杂乱的标签文本。
抱歉,漏了很重要的一点说明:
为什么分析的时候要把html标签过滤掉呢?
过滤html标签是为了降低干扰,因为我们关注的是正文内容,如果带着这样的标签 #0000ff;">var #0000ff;">new #000000;">去分析,可想而知,对我们的正文分析会有多大的干扰了,也正因如此需要将html标签掉,只对文本做分析,降低干扰。 基于网页分析构思出的正文提取算法 回顾以上的网页分析,如果按照文本密度来找提取正文,那么就是写这么一个算法,能够从过滤html标签后的文本中找到正文文本的起止行号,行号之间的文本就是网页正文部分。 还是从上面三个网页的分析结果看,他们都有这么一个特性: 正文部分的文本密度要高出非正文部分很多。 我们按照这个特性就可以很容易将算法实现,那就是基于阈(读音: yu)值去分析正文所在的位置。 那么接下来就需要解决一些问题: ∙如何确定阈值? ∙如何分析,一行行的分析? 还是? 阈值的确定可以通过统计分析得出一个比较好的值,我在实际处理过程中,发现这个值取180是比较合适的,也就是分析文本的时候,如果所分析的文本超过了180,那么就可以认为到达了正文部分。 再有就是如何分析的问题,这个其实比较容易确定,一行行的分析效果肯定不好,如果在按行分析的过程中往下在分析几行作为一次分析效果比较好。 也就是一次性分析上5行左右,将字符累加起来,看看有没有达到设定的阈值,如果达到了,那么认为已经进入正文部分了。 嗯,主要的处理逻辑就是这样,怎么样,不复杂吧。 我把实现的核心算法也贴出来吧: intpreTextLen=0;//记录上一次统计的字符数量(lines就是去除html标签后的文本,_limitCount是阈值,_depth是我们要分析的深度,sb用于记录正文)intstartPos=-1;//记录文章正文的起始位置for(inti=0;i _appendMode){break;}startPos=-1;}sb.Append(lines[i]);}preTextLen=len;} 核心的提取算法不足60行,经过验证提取的效果还是非常不错的,至少做到了正文提取正确率90%上,效率上做到了平均提取时间30ms左右。 还需解决的一些问题 html标签剔除: 这个简单,直接使用正则表达式替换(Regex.Replace(html,"(? is)<.*? >","")),将所有的html标签剔除即可 html压缩型网页的处理: 压缩后的html代码一般只有一行,对这类的html处理也比较简单(不需要复杂的代码格式化),直接在标签末尾强制添加换行符即可。 正文标题: 大多数规范的网址会用h1标签作文正文标题,处理时如果有h1那么从h1标签中提取标题,没有的话,直接从title标签中那吧。 文章发布时间: 并不是所有的文章都有发布时间(不过貌似大多数都有哈),直接使用正则从去除标签后的正文中提取时间吧。 保留带标签的正文: 我们的算法是和标签无关的,因为算法处理时首先要过滤html标签,去除干扰,那么如果想要带标签的正文怎么办(比如要保留正文中的图片)? 这时只能保留2个数组了,一个数组存放过滤标签的文本,便于分析,另一个数组则保留html标签,便于提取原始信息。 Html2Article网页正文提取算法 Html2Article就是我基于以上思想实现的网页正文提取算法。 有以下特点: ∙标签无关,提取正文不依赖标签。 ∙支持从压缩的html文档中提取正文内容。 ∙支持带标签输出原始正文。 ∙核心算法简洁高效,平均提取时间在30ms左右。 算法已开源(也算是为开源做点贡献了吧): 使用方法请参考文档介绍说明。 算法是用C#实现的,玩.NET的同学有福了,可以直接使用nuget将html2article添加到你的项目中哦。 另外发现直接从XX搜索“html2article”也能找到很快的找打它,算法实现已经将近半年了,一直比较懒,也没写过文章跟大家分享一下。 本文版权归翟士丹(StanZhai)和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 酷毙 雷人 1 鲜花 鸡蛋 漂亮 刚表态过的朋友(1人) ∙ wised 收藏分享邀请 上一篇: MassimoBanzi: Arduino如何开启开源想象力下一篇: 每个Linux用户都应该了解的命令行省时技巧
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网页 正文 提取