在向数组添加新元素时迭代数组

问题描述 投票:2回答:2

我正在用Ruby编写一个Web抓取脚本,该脚本打开一个二手车网站,搜索汽车的品牌/型号,循环搜索结果页面,然后在每个页面上抓取数据。

我遇到的问题是,我一开始不一定知道页面的最大数量,只有当我迭代到最近的几个已知页面时,分页才会增加并显示更多页面。

我已经将cleanpages定义为一个数组,并在我第一次打开该网站时用我知道的可用页面填充它。然后,我使用cleanpages.each do遍历那些“页面”。每次进入新页面时,我都会将所有已知页面重新添加到cleanpages中,然后运行cleanpages.uniq删除重复项。问题似乎是cleanpages.each do仅迭代原始长度的次数。

是否可以使它在each do循环中增加迭代的次数?

ruby iteration each
2个回答
2
投票

而不是使用Array#each,请尝试将数组用作队列。总体思路是:

queue = initial_pages
while queue.any?
  page = queue.shift
  new_pages = process(page)
  queue.concat(get_unprocessed_pages(new_pages))
end

这里的想法是,您只是从队列的开头一直取走物品,直到它变空为止。您可以在处理过程中将新项目推入队列的末尾,它们将得到正确处理。

您将要确保从已在队列中或已处理的new_pages中删除页面。

您也可以只保留数组数据结构,但手动保留指向列表中当前元素的指针。这具有维护“可见”页面的完整列表的优势,因此您可以在将剩余的任何内容追加到列表之前将它们从new_pages列表中删除:

index = 0
queue = initial_pages
while true do
  page = queue[index]
  break if page.nil?
  index += 1
  new_pages = get_new_pages(page) - queue
  queue.concat(new_pages)
end

0
投票

而不是使用Array#each,请尝试将数组用作队列。总体思路是:

queue = initial_pages
while queue.any?
  page = queue.shift
  new_pages = process(page)
  new_pages.each {|new_page| queue.push(new_page) }
end

这里的想法是,您只是从队列的开头一直取走物品,直到它变空为止。您可以在处理过程中将新项目推入队列的末尾,它们将得到正确处理。

© www.soinside.com 2019 - 2024. All rights reserved.