如何在遍历数组时设置等效于单个数组对象的变量?



菜鸟问题。我需要将 3,000+ 个 URL 从 CSV 工作表传递到 Selenium。我需要Selenium导航到这些链接中的每一个,抓取信息,然后将该信息放入CSV。

我遇到的问题是,当我将 CSV URL 推送到数组中时,我无法一次将一个对象 (url) 传递到 Selenium 中。

我知道我可能需要某种循环。我尝试使用 .map、.select 设置循环并从数组中进行选择。只是一个 do 循环。

urls.map do |url|
@driver.navigate.to #{url}
name = @driver.find_element(:css, '.sites-embed- 
footer>a').attribute('href')
puts name
kb_link = name
kb_array.push(kb_link)
puts 'urls is #{n}'
end

在上面的示例中,Selenium 返回"无效 URL"错误消息。使用 Pry 进行去虫告诉我,我的"url"对象不是单个 url,而是整个数组。

如何设置 Selenium 以逐个访问数组中的每个 URL?

编辑:---------------- 因此,在使用Pry进行广泛的去虫之后,我发现了几个问题。首先是我的 CSV 将嵌套数组馈送到我的循环中,这导致了 URL 错误。我不得不展平我的数组并取消嵌套它以解决这个问题。

之后,我必须在我的循环中构建一个救援,这样我的脚本就不会在遇到没有我正在寻找的 CSS 元素的页面时死机。

这是最终的循环。

begin
@urls1.each do |url|
@driver.navigate.to(url)
@driver.manage.timeouts.implicit_wait = 10
name = @driver.find_element(:css, '.sites-embed- 
footer>a').attribute('href')
puts name
kb_link = name
kb_array.push(kb_link)
puts 'done'
rescue Selenium::WebDriver::Error::NoSuchElementError
puts 'no google doc'
x = 'no google doc'
kb_array.push(x)
next
end

使用.each怎么样?

例:

array = [1, 2, 3, 4, 5, 6]
array.each { |x| puts x }

在您的代码中:

urls.each do |url|
@driver.navigate.to #{url}
name = @driver.find_element(:css, '.sites-embed-footer>a').attribute('href')
puts name
kb_link = name
kb_array.push(kb_link)
puts 'urls is #{n}'
end

首先,如果你不在某处使用块的结果,那么使用map就没有多大意义。 应用于枚举的map返回一个新的数组,并且您不会对返回的数组执行任何操作(在您的情况下,该数组仅包含puts的返回值,通常为 nil,因此您只会返回一个 nils 数组,副作用是某些内容被写入 stdout。

如果只对副作用感兴趣,则应使用eacheach_with_index来遍历枚举。鉴于您在mapeach方面遇到的问题,我想知道您的对象的实际内容是什么urls.你检查过吗?你可以做一个

p urls

在进入循环之前。对于 3000 个 URL,输出将是巨大的,但也许您可以在具有较少 URL 的更简单的示例中运行它。

最新更新