【问题标题】:Finding the content of HTML section document查找 HTML 部分文档的内容
【发布时间】:2009-08-04 09:04:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 对于网络上的大多数页面,您可以很好地找到任何“有趣的部分”
  • 这是一个很难回答的问题。如果很容易从噪音中识别出“有趣的内容”,那么每个人都会使用“噪音”过滤器,就像 Adblock 用于阻止广告一样。也就是说,通常情况下,用户看到的内容(基本上是去除标记和脚本逻辑的 html 文件的整个内容)可能包含“信息”,并且可以使用 htmlToText 转换器提取。 www.htmlparser.org 中的 StringBean 类可用于执行此操作(java)。

标签: html algorithm rss heuristics


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的回复,我想我至少会使用您的一些想法。我一直在尽可能地避免启发式方法,但我开始意识到没有任何逃避......
  • 这是问题的一部分,也是 HTML 规范的成功之处,它是通用的这一事实意味着它在语义上不够丰富,无法涵盖复杂的信息提供(与简单的学术文本相比)当今网站所要求的。我仍然认为导航标签会极大地帮助能够隔离页面的大部分......
【解决方案2】:

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

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

然后您可以查看剩余的内容,看看是否有一些噪音溜进来。当您收集了合理数量的这些数据后,请尝试在其中找到一些模式。完善你的逻辑并重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多