如何仅为导航菜单抓取网站

时间:2015-05-06 17:24:56

标签: web-scraping html-agility-pack nav scrape navigationbar

我正在构建一个抓取网站的程序。它查看整个网站,只从该网站获取页眉和页脚导航菜单,然后在页眉和页脚菜单之间插入新的html标签(div,p,table等)。

我正在寻找关于 如何仅删除页眉和页脚导航菜单以及在两者之间添加代码的一些想法

我正在使用HTML Agility Pack并参与了一些方法。

方法1:

  

在大多数情况下,页眉和页脚导航菜单大多数都是   链接,文字很少。我使用了一个阈值变量   是文本与链接的比率。如果比率text:节点的链接是   如果小于阈值,节点将被视为菜单节点,并且   它会被保存。 text:links比率大于的任何节点   阈值将被删除。

方法1适用于某些网站,但不适用于其他网站,因此我放弃了它。

方法2:

  

我在每个节点中搜索了包含" nav"的id或class属性。   或"菜单"。 " n"," a"," v"," m"," e"," n& #34;" U"可能是大写或   小写," nav"和"菜单"本来可以被任何人包围   人物组合。这样,它将包括id和   类如" bottomNav"," navRight1"," LeftMenu2"等等。如果是id   或者类包含" nav"或者" menu",节点将被保存。   如果节点的属性不包含这些条款中的任何一个或任何条款   节点的后代不包含这些术语中的任何一个   节点将被删除。

同样,方法2适用于某些网站,但不适用于其他网站。

对于其中任何一种方法都有效的网站,我仍然无法在两个菜单之间放置新的html代码,因为我无法分辨标题菜单的结束位置以及页脚菜单的位置开始了。

我正在寻找关于如何从网站上仅删除页眉和页脚导航菜单的其他想法,并在两者之间插入新的html代码。

1 个答案:

答案 0 :(得分:1)

除了查找特定元素或元素类(headernav,...)之外,您可以尝试以不同的方式查看问题:

  • 首先,从每个网站获取并解析两个(或更多)页面,最好检查它们是否有很大差异(但不是完全);
  • 然后,做一个diff(最好是DOM),并只保留公共结构。

这个常见的结构应该主要包括页眉,页脚,导航栏和其他元素,或多或少在每个网站上保持不变。

最后一步可能是在这个常见结构中查找由页眉/页脚引起的小间隙,这些间隙因上下文而异,而不是由不同(主要)内容引起的大间隙,并从最大集合中删除它们的可能值您可以从每个网站获取的页面。