Ruby Rails 在 Rails 控制台中抓取不同的结果

Ruby Rails Screen Scrape different results in Rails Console

我对 Rails 控制台的 Nokogiri 命令 运行 和 Rails 中的相同命令 运行 的差异感到困惑] 帮手.

在 Rails 控制台中,我可以使用这些命令捕获我想要的数据:

endpoint = "https://basketball-reference.com/leagues/BAA_1947_totals.html"
browser = Watir::Browser.new(:chrome)
browser.goto(endpoint) 
@doc_season = Nokogiri::HTML.parse(URI.open("https://basketball-reference.com/leagues/BAA_1947_totals.html")) 
player_season_table = @doc_season.css("tbody")
rows = player_season_table.css("tr")
rows.search('.thead').each(&:remove) #THIS WORKED
rows[0].at_css("td").try(:text) # Gets single player name
rows[0].at_css("a").attributes["href"].try(:value) # Gets that player page URL

但是,我的 rails 帮助器旨在接受这些命令并将它们折叠到方法中:

module ScraperHelper
  def target_scrape(url)
    browser = Watir::Browser.new(:chrome)
    browser.goto(url)
    doc = Nokogiri::HTML.parse(browser.html)
  end
  def league_year_prefix(year, league = 'NBA')
    # aba_seasons = 1968..1976
    baa_seasons = 1947..1949
    baa_seasons.include?(year) ? league_year = "BAA_#{year}" : league_year = "#{league}_#{year}"
  end
  def players_total_of_season(year, league = 'NBA')
    # always the latter year of the season, first year is 1947 no quotes
    # ABA is 1968 to 1976
    league_year = league_year_prefix(year, league)
    @doc_season = target_scrape("http://basketball-reference.com/leagues/#{league_year}_totals.html")
  end
  def gather_players_from_season
    player_season_table = @doc_season.css("tbody")
    rows = player_season_table.css("tr")
    rows.search('.thead').each(&:remove)
    puts rows[0].at_css("td").try(:text)
    puts rows[0].at_css("a").attributes["href"].try(:value)
  end
end

在该模块上,我尝试模拟 rails 控制台命令并将它们分成模块。为了测试它(因为我还没有构建任何其他功能或视图),我 运行 Rails 控制台,包括这个助手和 运行 方法。

但我得到的结果截然不同。 在 gather_players_from_season 方法中,我可以看到

player_season_table = @doc_season.css("tbody")

不再像在 运行 作为命令行逐行抓取相同的数据。它也不喜欢这里的属性方法:

puts rows[0].at_css("a").attributes["href"].try(:value)

所以我的第一个想法可能是宝石的不同? Watir 正在推出无头浏览器。据我所知,Nokogiri 不会导致错误。

您首先想到比较 Gem 版本是个好主意,但我注意到两种代码解决方案之间存在差异:

在 Rails 控制台中

代码用 URI.open 解析 HTML:Nokogiri::HTML.parse(URI.open("some html"))

在ScraperHelper代码中

代码不调用URI.open、Nokogiri::HTML.parse("some html")

也许这种差异会 return 不同的值并使 ScraperHelper 的其余部分 return 出乎意料的结果。