这实际上并不是一个编程问题,更多的是一个算法问题。

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

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

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

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

有帮助吗?

解决方案

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

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

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

然后第二遍可以开始排除常见的情况 div 或者 ul id/类名称,以及其中的所有标签,例如:

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

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

为了识别内容,我会查找任何标题标签,然后跟随一个段落标签。(这可能是 h2 您的主要内容;这 h1 标签经常(并且可以说是错误地)用于显示站点名称或徽标,但这有望通过排除页面的标题部分来消除。)每个后续段落都应添加到当前内容中,直到到达休息处,这可能是结束 div 或者 td 元素,或者它可能是与您开始的同一级别的标题元素。

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

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

其他提示

一个结构良好站点将具有其公共区域重用相同的代码,例如导航,报头和等

当你有,你想分析,试图通过同一个域/子站点下的几个其他网页浏览和寻找这是所有页面元素的目标页面。这些都是你想摆脱的噪音。

然后,你可以看看有什么剩余,就看一些噪音的下滑。当你收集这些数据的合理数量,试图找到一些模式在其中。优化你逻辑并重复。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top