【问题标题】:Ruby web scraping with selenium使用 Selenium 进行 Ruby 网页抓取
【发布时间】:2019-07-24 08:03:55
【问题描述】:

我正在尝试抓取一个网站并剥离两个不同的东西并将它们打印在一起。 PlayStation 奖杯的标题和说明。

require 'selenium-webdriver'

  driver = Selenium::WebDriver.for(:chrome, options: options)

  driver.get('https://www.playstationtrophies.org/game/far-cry-4/trophies/')

  puts driver.title

  trophies = driver.find_elements(:class, 'link_ach')
  description = driver.find_elements(:class, 'ac3') 

  trophies.each do |trophy|
    description.each do |desc|
      puts trophy,desc.text.strip
     end
  driver.quit
end

我可以将它们单独剥离,但是当试图将它们放在一起时会出现可怕的错误。

【问题讨论】:

  • 您能否描述一下您所说的严重错误以及预期的输出是什么意思?

标签: ruby selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

我不完全确定您所说的“大错特错”是什么意思,但根据您所拥有的运行情况,我的最佳猜测是,对于 trophy,您实际上是在屏幕上打印对变量 trophy 的检查的字符串值。所以你得到了很多:

#<Selenium::WebDriver::Element:0x00007ff4b60e5eb8>

如果您打印两个 Element 的文本值,我认为您会对输出更满意:

puts "#{trophy.text.strip}\n #{desc.text.strip}"

如果这确实是您遇到的问题,您可能需要在 ruby​​ 中查看 to_sinspect

【讨论】:

  • 谢谢。这就说得通了。虽然我看到两者之间存在脱节。如何打印关联的奖杯以及下方的说明?
  • puts "#{...}\n #{...}" 其中\n 只是一个换行符。
  • 为完整性添加了换行符
【解决方案2】:

这里对奖杯和描述的迭代非常混乱。你有两个独立的集合/数组,奖杯和描述。然后,您使用了嵌套循环并在循环内退出驱动程序。因此它将显示第一个奖杯下的所有描述。

如果你想在相关奖杯下显示每个描述,那么你可以这样做:

puts driver.title

trophies = driver.find_elements(:class, 'link_ach')
descriptions = driver.find_elements(:class, 'ac3')
data_sets = trophies.zip(descriptions)

datasets.each do |trophy, description|
    puts trophy.text.strip, description.text.strip
end

driver.quit

然后,您可以根据需要在 puts 中自定义显示文本。

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 2019-06-23
    • 2021-05-08
    • 2018-07-20
    • 2020-03-13
    • 1970-01-01
    相关资源
    最近更新 更多