【问题标题】:How can I scrape a website for the nav menu only我怎样才能只为导航菜单抓取网站
【发布时间】:2015-05-06 17:24:56
【问题描述】:

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

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

我正在使用HTML Agility Pack 并研究了一些方法。

方法一:

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

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

方法二:

我在每个节点中搜索了包含“nav”的 id 或类属性 或“菜单”。 "n","a","v", "m","e","n","u" 可能是大写或 小写,并且“nav”和“menu”可以被任何包围 字符的组合。这样,它将包括 id 和 类如“bottomNav”、“navRight1”、“LeftMenu2”等。如果 id 或包含“导航”或“菜单”的类,节点将被保存。 如果节点的属性不包含这些术语中的任何一个,或者任何 节点的后代不包含这些术语中的任何一个, 节点将被删除。

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

对于使用这两种方法的网站,我仍然无法在两个菜单之间放置新的 html 代码,因为我无法确定页眉菜单的结束位置和页脚菜单的开始位置。

我只是在寻找其他想法,了解如何仅从网站上抓取页眉和页脚导航菜单,并在两者之间插入新的 html 代码。

【问题讨论】:

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


    【解决方案1】:

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

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

    这种通用结构应该主要由页眉、页脚、导航栏和其他在每个网站上或多或少保持不变的元素组成。

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

    【讨论】:

    • 不错的方法。很想看到这样的一个例子。我假设你会使用 python 的 difflib link?另外,不确定您的意思是“最好是 DOM”。
    • @leeprevost,我不确定这些天我会使用什么(我也不记得当时想到了什么特定的工具),但 difflib 似乎是一个完全合理的(文本差异)选择。通过区分“DOM,最好是”我的意思是做一个 DOM 树的差异,而不是 HTML 的简单文本差异:让它在文档的结构上运行(而不是在文本内容上),并让它容忍可能从 JS 动态创建整个结构的站点。
    猜你喜欢
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多