如何检测网页上的导航菜单

4

我正在编写一个程序,它会打开一个网页,并且需要检测该页面具有多少个导航(菜单),主导航有多长(有多少元素),以及导航元素的平均文本长度等...

无论如何,我在检测菜单方面遇到了一些问题。我认为 web 导航有两种编码方式:

1. <ul><li><a>Home</a><li><a>Products</a></li>...</ul>
2. <div><a>Home</a><a>Product</a>...</div>

如果我发现这种结构,我就知道(或者说“我认为”)它是导航。但这并不是绝对可靠的。我会得到很多错误结果。

那么有没有更好的方法来检测网页上的导航呢?

4个回答

5

没有通用的解决方案,您需要实现一些启发式方法。我将尝试以下方法:

  1. 使用递归限制为1获取所有站点页面(例如wget-r-l1 http://example.com/
  2. 对于每个内部页面,保留该页面上的内部链接集
  3. 获取所有集合的交集。

这样,您将获得一个常数集合的内部链接,大多数情况下将是站点的“菜单”。


有趣的解决方案!虽然它需要比尝试简单分析单个页面的“菜单式”HTML结构更多的处理(和加载),但你可能是对的,它将为网站的菜单提供一个非常好的估计。 - richardolsson

2
在HTML4和XHTML中,没有标准的编写菜单的方式。在HTML5中,您可以使用<menu><nav>标签,但是正如您所得出的结论,在早期版本中,通常推荐的方法是使用无序列表。
我可能会编写多个测试,并同时使用它们来尝试查找菜单,例如基于文档位置、结构以及像idclass属性(其值通常包含“menu”)这样的东西。

1
不要忘记 HTML5 的 <nav> 标签。

0

在之前的回答中,一个包含 "nav" 的 ul 或 div 元素,并且具有 class 或 id 属性,可能也是你想要的。然而,并没有通用的答案。此外,请记住可能存在主导航菜单和次级导航菜单的情况(例如顶部菜单和侧边菜单,或者 Stack Overflow 页面顶部的两个水平菜单)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接