这不是一个编程问题,而是一个算法问题。
问题:查找HTML页面的“内容”部分。
“内容”是指包含人类看到的页面内容的dom,没有噪音,只是“页面实际内容”。 我知道问题没有明确定义,但让我们继续...... 例如在博客网站中,这通常很容易,当浏览到特定帖子时,您通常在页面顶部有一些工具栏,也许是LHS上的一些导航元素,然后您拥有包含内容的div。试图从HTML中解决这个问题可能很棘手。幸运的是,大多数博客都有RSS源,在这篇特定帖子的Feed中你会发现< description> section(或< content:encoded>),这正是你想要的。 因此,要优化内容的定义,这是页面上包含有趣部分的实际内容,删除所有广告,导航元素等。 因此,假设他们拥有RSS,那么从博客中查找内容相对容易。其他RSS支持网站也是如此。
新闻网站怎么样?在许多情况下,新闻网站都有RSS,但并非总是如此。那么如何在新闻网站上找到内容呢? 更一般的网站怎么样?许多网页(当然不是所有网页)都有内容部分和其他部分。你能想到一个好的算法来找到那些“有趣”的部分而不是那么有趣吗?也许那些不改变的部分会改变?
希望我已经说清楚了......谢谢!
答案 0 :(得分:2)
我没有这样做,但这是我的一般做法。
如您所示,HTML中可见内容部分缺少结构(即它没有header
,navigation
,ads
等标记)意味着它更难回到页面的关键部分。我的方法是首先删除你明确认为不感兴趣的不同元素。可能的排除列表可能是:
!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"
。保留您检测到的辅助内容项也可能很有用,这样,如果某些网站有一种奇怪的方式来构建内容,那么一旦您将捕获器添加到算法中,就可以重新运行网站的内容。
答案 1 :(得分:0)
结构良好的网站将使其公共区域重复使用相同的代码,例如:导航,标题等。
如果您有要分析的目标页面,请尝试浏览同一域/子域下的其他几个页面,并查找所有页面共有的元素。那些是你想摆脱的噪音。
然后你可以看看剩下的是什么,看看是否有一些噪音进入。当你收集到合理数量的这些数据时,试着在其中找到一些模式。优化你的逻辑并重复。