Ruby on rails 如何在不可预测的结果下创建嵌套循环

Ruby on rails 如何在不可预测的结果下创建嵌套循环,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在开发一个网络爬虫应用程序。它将列出一个给定域的所有链接,作为分类站点地图的一部分。我正在使用Nokogirigem来解析和搜索HTML。此代码适用于单个页面: doc = Nokogiri::HTML(open("url")) links = doc.css("a") unless links.blank? links.each do |t| if t["href"].first == "/" // link stuff e

我正在开发一个网络爬虫应用程序。它将列出一个给定域的所有链接,作为分类站点地图的一部分。我正在使用
Nokogiri
gem来解析和搜索HTML。此代码适用于单个页面:

doc = Nokogiri::HTML(open("url"))
links = doc.css("a")

unless links.blank?
    links.each do |t|
        if t["href"].first == "/"
            // link stuff
        end
    end
end
在注释行,我可以执行另一个
doc=Nokogiri::HTML(open(t_URL))
并接收第二组链接,依此类推。但是第三步、第四步或第五步呢


我将如何抓取整个网站的所有其他页面以及在以前页面上有链接的其他页面?每页的链接数量是不可预测的,因此我不能使用
每一次
。如何继续访问所有页面和其他嵌套页面并跟踪所有页面的链接?

如您所述,当迭代器预先固定时,将使用每个
次。当您没有固定的迭代器时,您需要使用循环,如
循环
while
直到
,并在找到所有链接后从中断开。

您需要做的就是跟踪散列中的绝对URL。散列的值可以是一个计数,或者您可能希望跟踪上次使用时间戳刮取每个页面的时间。注意:刮水时,您应该只得到
href
s:

to_visit = {"url" => Time.now}

while !to_visit.empty? do

  doc = Nokogiri::HTML(open(to_visit.shift.first))

  doc.css("a[href]").each do |link|
    url = make_absolute(link)
    to_visit[url] = Time.now #add this page to the to_visit 'list'
  end

end

您需要定义
make_absolute
,它应该创建一个完整的URL,包括协议、主机、端口和路径。

一种方法是对正在显示的代码创建一个方法,然后再次调用它(递归)当您在链接中遇到
href
并从中提取HTTP地址时,我会使用散列并将路由存储为来自根的绝对路径。然后在散列中查找条目,如果它不存在,则添加它。如果要跟踪深度,可以嵌套哈希。您也可以使用数组并检查路径是否在arrayGuys中,一些示例代码将非常感谢:\n我对这个问题感到迷茫。嗨,Mark,对不起,我不明白这个答案是否与我的问题有关:\n正如我上面所说,我可以在给定页面中获得链接列表,但我不知道如何循环页面。假设捕获了第一页链接。我将如何获得其他页面的其他链接,这些链接将被导航到另一个页面?这就是
to_visit
散列的目的。它可能是一个
集合
,因为它基本上只需要是您需要访问的页面的唯一列表。我添加了一个循环,这样您就可以看到如何迭代它。