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