2

这不是一个真正的编程问题,更像是一个算法问题。

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

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

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

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

4

2 回答 2

2

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

正如您所指出的,HTML 的可见内容部分缺乏结构(即它没有诸如header, navigation,ads之类的标签),这意味着很难找到页面的关键部分。我的方法是首先删除您确定不感兴趣的不同元素。可能的排除列表可能是:

  • 元元素,例如!doctype, head(将title视为单独的数据)
  • 动态元素,例如object, embed, applet,script
  • 图像(取决于是否要保留它们),img
  • 表单元素,即form, input, textarea, label, legend, select,option

然后第二遍可以开始排除常见的名称divulid/类名称,以及其中的所有标签,例如:

  • header, footer,meta
  • nav, navigation, topnav,sidebar
  • ad, ads, adu(以及其他常用的广告名称)

这有望从页面中删除大量的装饰。下一个挑战是尝试从剩下的内容中识别主要内容,我建议最初假设网站作者正确使用语义 HTML,因此主要使用h1, h2head 标签和p段落标签。

为了识别内容,我会查找任何标题标签,然后是段落标签。(这可能h2适用于您的主要内容;该h1标签通常(并且可以说是不正确的)用于显示网站名称或徽标,但希望通过排除页面的标题部分来消除这种情况。)应该添加每个后续段落到当前内容,直到你到达一个中断,这可能是divortd元素的结尾,也可能是你开始的同一级别的标题元素。

由于您在页面上可能仍然收集了几组内容(可能是主要内容加上关于作者的简介),您需要在此处测试和完善一个决策步骤,以选择最有可能的候选人。就长度和使用的段落元素数量而言,这通常只是最大的。

随着您收集更多内容示例,您可以为算法添加支持措施;这可能是您注意到许多页面使用div id="content"id="maincontent"。保留您检测到的次要内容项也可能很有用,这样如果某些网站有一种奇怪的内容结构方式,那么一旦您在算法中添加了一个捕捉器,它就可以重新运行它网站的内容。

于 2009-08-11T08:41:46.887 回答
0

一个结构良好的网站将有其公共区域重用相同的代码,例如导航、标题等。

当您有想要分析的目标页面时,请尝试浏览同一域/子域下的其他几个页面,并找到所有页面共有的元素。这些是你想要摆脱的噪音。

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

于 2009-08-19T17:57:00.863 回答