2009-11-07 177 views
-1

示例场景:请注意,根据网站的不同,这可能会很深或很浅。 蜘蛛扫描链接的第一页。它将它存储为array1。递归嵌套循环

蜘蛛进入第一个链接,它现在在第二页上。它会看到链接,并将其存储为array2。

蜘蛛进入第二页上的第一个链接,它现在在第三页。 它看到链接,并将其存储为array 3.

请注意,这是一般情况。我想强调需要在循环中执行多个循环。

rootArray [数组1,数组2,ARRAY3 ....]

我该怎么办递归嵌套循环? array2是array1中每个VALUE的子元素(我们假设结构非常均匀,array1中的每个VALUE在array2中都有相似的链接)。数组3是array2的每个值的子元素。等等。

回答

1

您会希望将这些结果存储在树中,而不是数组的集合。 Page1会有每个链接的子节点。其中每一个都有链接的子节点等。另一种方法是将所有链接存储在一个数组中,通过网站递归来查找有问题的链接。你真的需要他们在一个类似于该网站的结构吗?

当你添加任何新的链接到列表/树/任何你已经得到的时候,你还想检查重复的链接。否则,诸如page_1 - > page_2 - > page_1之类的循环会破坏您的应用。

这里你真正的目标是什么?网页抓取工具并不完全是新技术。

2
module Scratch 
    def self.recur(arr, depth, &fn) 
    arr.each do |a| 
     a.is_a?(Array) ? recur(a, depth+1, &fn) : fn.call(a, depth) 
    end 
    end 
    arr = [[1, 2, 3], 4, 5, [6, 7, [8, 9]]] 
    recur(arr, 0) { |x,d| puts "#{d}: #{x}" } 
end 
+0

我喜欢这个,因为我甚至无法识别语言。回到我的幼儿园。 – 2012-02-25 01:15:08

1

这一切都取决于你正在尝试做的。

如果你正在收获链接,那么一个散列或集合将工作得很好。一个数组也可以使用,但可能导致一些陷阱。

如果您需要显示网站的结构,您需要一个树或数组数组以及标记您访问过哪些网址的方式。

在任何情况下,您都需要避免冗余链接进入循环。对你下降的深度以及你是否记得和/或关注网站外的链接进行某种限制也是很常见的。