2009-08-04 91 views
2

这不是一个真正的编程问题,更多的算法问题。查找HTML部分文档的内容

问题:查找HTML页面的“内容”部分。

“内容”指的是包含人类看到的页面内容的dom,没有噪音,只是“页面实际内容”。 我知道问题没有很好的定义,但让我们继续... 例如在博客网站中,这通常很容易,当浏览到特定的帖子时,您通常会在页面的顶部有一些工具栏,也许有些导航元素在LHS上,然后你有包含内容的div。试图从HTML中弄清楚这一点可能会很棘手。然而幸运的是,大多数博客都有RSS源,在这个特定帖子的Feed中,您会发现<说明>部分(或<内容:编码>),这正是您想要的。 因此,为了优化内容的定义,这是包含有趣部分的实际内容,删除所有广告,导航元素等。 因此,从博客中查找内容相对容易,假设他们拥有RSS。其他RSS支持网站也一样。

新闻网站呢?在很多情况下,新闻网站都有RSS,但并非总是如此。如何在新闻网站上找到内容? 更一般的网站呢?许多网页(当然不是全部)都有内容部分和其他部分。你能想出一个好的算法来找到那些“有趣”的部分,而不是那么有趣?也许从那些不变的部分改变了?

希望我已经说清楚了......谢谢!

+0

对于网络上的大多数网页,您很好地发现任何“有趣的部分” – 2009-08-04 09:12:17

+0

这是一个难以回答的问题。如果很容易从噪音中识别“有趣的内容”,那么每个人都会使用“噪音”过滤器,就像Adblock用于阻止广告一样。 也就是说,通常,用户看到的内容(基本上剥离了标记和脚本逻辑的html文件的全部内容)可能包含“信息”,并且可以使用htmlToText转换器提取。来自www.htmlparser.org的StringBean类可以用来做到这一点(java)。 – hashable 2009-08-28 00:27:10

回答

2

我还没有这样做,但这将是我的一般方法。

正如你指出,在可见的内容部分的结构的缺乏(即它没有标记,如headernavigationads)的HTML意味着它是很难的家在页面的重要组成部分。我的方法是首先删除你明确认为不重要的独特元素。排除的一种可能的列表可以是:

  • meta元素如!doctypehead(取title作为单独的数据片)
  • 动态元素如objectembedappletscript
  • 图像(取决于是否要保留它们),img
  • 表单元素,即forminputtextarealabellegendselectoption

第二遍可以再启动排除经常出现的divul ID /类名,并在他们的所有标签,如:

  • headerfootermeta
  • navnavigationtopnavsidebar
  • adadsadu(通常用于广告和其他名称)

这将有望从页面中移除装饰的显著量。下一个挑战是尝试从剩下的内容中确定主要内容,并且我建议最初假定网站作者正确使用语义HTML,所以主要使用h1,h2头标记和段落标记。

为了识别内容,我会寻找任何标题标签,然后是段落标签。 (对于您的主要内容,这可能是h2; h1标记经常(并且可以错误地)用于显示网站名称或徽标,但希望通过排除页面的标题部分来删除此标记。)每个后续段落都应该将其添加到当前内容中,直到达到中断为止,这可能是divtd元素的结尾,也可能是您开始的同一级别的标题元素。

由于您可能在页面上收集了几组内容(可能是主要内容以及作者的简介),因此您需要测试并完善一个决策步骤,该步骤选择最多可能的人选。这通常是最大的,无论在长度和使用的段落元素数量方面。当您收集更多内容示例时,您可以在算法中添加支持度量;这可能是你注意到许多页面使用div id="content"id="maincontent"。保留您检测到的辅助内容项也很有用,因此,如果某些网站具有构建内容的好奇方式,那么一旦您将捕手添加到您的算法中,就可以针对此操作重新运行它网站的内容。

0

一个结构良好的网站将有相同的代码重复使用相同的代码,例如,导航,标题等。

如果您有要分析的目标页面,请尝试浏览相同域/子域下的其他几个页面,找到所有页面通用的元素。那些是你想要摆脱的噪音。

然后你可以看看剩下的东西,看看是否有噪音溜进来。当你收集到合理数量的这些数据时,试着在它们中找到一些模式。优化你的逻辑并重复。