抓取网页新闻(为什么分析的时候要把html标签过滤掉呢?(图) )

优采云 发布时间: 2021-12-23 09:13

  抓取网页新闻(为什么分析的时候要把html标签过滤掉呢?(图)

)

  前两种方法还是比较容易实现的,主要是处理比较简单。我之前实现了标签密度提取算法,但实际使用中的错误率还是比较高的;后两种方法在实现上稍微复杂一些。就算法效率而言,应该不会高很多。

  我们需要的是一种简单易实现的算法,可以保证处理速度和提取精度。因此,结合前两种算法,研究网页的html页面结构,有更好的处理思路,称为基于文本密度的文本提取算法。后来在网上搜索了类似的算法,发现也有类似的处理方法用于处理文本提取,但还是有一些区别的。接下来和大家分享一下这个算法的一些处理思路。

  网络分析

  我随意从百度、搜狐、网易上拿了一个新闻页面进行分析。

  先看一篇关于百度文章的文章

  为什么任正非主动跟我合影,

  首先请求这个页面,然后过滤到所有的html标签,只保留文本信息,我们可以看到文本信息集中在以下位置:

  

  用Excel分析行数与每行字符的关系可以发现:

  

  很明显,文字内容集中在65-100行之间的位置,这个区间的字符数也比较密集。

  网易的另一篇文章文章

  张小龙神话破灭,马化腾接管微信。

  我们先看过滤html标签后的body部分:

  

  这是另一个Excel分析结果:

  

  正文部分集中在第 279-282 行之间。从图中可以看出,正是这几行的文字密度特别高。

  最后分析一个搜狐新闻

  李克强在天津考察考察的片刻,

  我们先看post标签后面的文字:

  

  再看Excel的分析结果:

  

  搜狐文章的正文主要集中在第200-255行。剩下的文字都是乱七八糟的标签文字。

  抱歉,我漏掉了很重要的一点:为什么我分析的时候会过滤掉html标签?过滤html标签的目的是为了减少干扰,因为我们关心的是文本的内容,如果你携带这样的标签 style="color: #0000ff;">var chart = style="color: #0000ff;"> newstyle="color: #000000;">进行分析,可以想象一下会对我们的文本分析造成多大的干扰,为此我们需要去掉html标签,只对文本进行分析以减少干扰干涉。

  基于网页分析构思的文本提取算法

  回顾上面的网页分析,如果根据文本密度找到提取的文本,那么这是一个算法,可以在过滤html标签后从文本中找到文本的开始和结束行号。行号之间的文本是网页的主体。

  从以上三个网页的分析结果来看,它们都具有这样一个特点:正文部分的文本密度远高于非正文部分。根据这个特点,我们可以很容易的实现算法,就是根据阈值(发音:yu)值来分析文本的位置。

  那么有一些问题需要解决:

  可以通过统计分析来确定阈值以获得更好的值。在实际的处理过程中,我发现这个值取180比较合适。也就是在分析文本的时候,如果分析的文本超过180,那么就可以认为该文本已经达到了。

  然后是如何分析的问题。这实际上更容易确定。逐行分析肯定不好。如果在逐行分析的过程中分析几行,最好将几行分析为一个分析。即一次分析上面的5行,将字符相加,看是否达到阈值。如果达到阈值,则认为它已经进入了身体部位。

  嗯,主要的处理逻辑是这样的,怎么样,不复杂。

  我还将发布实现的核心算法:

  核心提取算法不到60行。经过验证,提取效果还是很好的。至少达到90%的文本提取正确率,效率平均提取时间30ms左右。

  一些需要解决的问题

  html标签去除:这个很简单,直接用正则表达式替换(Regex.Replace(html, "(?is)", ""))来去除所有html标签

  html压缩网页的处理:压缩后的html代码一般只有一行,这类html的处理比较简单(不需要复杂的代码格式化),直接在标签末尾加一个换行符即可。

  正文标题:大多数标准 URL 将使用 h1 标签来组成正文标题。如果有 h1,则从 h1 标签中提取标题。如果没有,只需使用标题标签。

  文章 发布时间:并不是所有的文章都有发布时间(不过好像大部分都有),去掉标签后用regular从文本中提取时间即可。

  Keep tagged text:我们的算法与标签无关,因为算法要先过滤html标签去除干扰,那么如果你想要tagged文本(比如你想把图片保留在文本中)怎么办?这时候只能保留两个数组。一个数组存储过滤器标签的文本以便于分析,另一个数组保留html标签以便于提取原创信息。

  Html2Article网页正文提取算法

  Html2Article 是我基于上述思想的网页正文提取算法。具有以下特点:

  算法已经开源(可以认为是对开源的贡献):

  有关如何使用它的说明,请参阅文档。

  该算法是在 C# 中实现的。玩.NET 的同学有福了,可以直接用nuget 把html2article 添加到你的项目中。

  

  另外,我发现直接从百度搜索“html2article”也可以很快找到。算法实现快半年了,比较懒,没写文章分享给大家。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线