0

我正在尝试学习如何通过屏幕抓取获取数据,然后将其保存到模型中。到目前为止,我可以获取数据。我这样说,好像我这样做:

puts home_team

我让所有的主队回归

get_match.rb #抓取数据

require 'open-uri'
require 'nokogiri'

module MatchGrabber::GetMatch

FIXTURE_URL = "http://www.bbc.co.uk/sport/football/premier-league/fixtures"

def get_fixtures
doc = Nokogiri::HTML(open(FIXTURE_URL))
home_team =  doc.css(".team-home.teams").text
end
end

然后我想更新我的模型

match_fixtures.rb

 module MatchFixtures
 class MatchFixtures
 include MatchGrabber::GetMatch

def perform
  update_fixtures
end

private

 def update_fixtures
  Fixture.destroy_all
  fixtures = get_fixtures
end

def update_db(matches)
  matches.each do |match|
    fixture = Fixture.new(
      home_team: match.first
      )
    fixture.save
 end
end
end
end

所以下一步就是我卡住的地方。首先,我需要将 home_team 结果放入一个数组中?

第二部分是我通过我的 update_db 方法传递匹配,但这不正确,我在这里传递什么,我的 update_fixtures 方法或方法本身的 home_team 的结果?

要运行我执行的任务:

namespace :grab do
task :fixtures => :environment do
MatchFixtures::MatchFixtures.new.perform
end
end

但什么都没有得救,但这是意料之中的。

这里有陡峭的学习曲线,希望能朝着正确的方向前进。

4

2 回答 2

1

您可以将数组直接传递给更新方法:

def update_fixtures
  Fixture.destroy_all
  update_db(get_fixtures)
end

def update_db(matches)
  matches.each {|match| Fixture.create(home_team: match.first) }
end

或者一起取消该方法:

def update_fixtures
  Fixture.destroy_all
  get_fixtures.each {|match| Fixture.create(home_team: match.first) }
end
于 2013-03-11T21:24:55.717 回答
1

调用css(".team-home.teams").text不会将匹配的 DOM 元素作为数组返回,而是作为单个字符串返回。

为了获得一个元素数组,将 get fixture 重构为如下所示:

get_teams
  doc = Nokogiri::HTML(open(FIXTURE_URL))
  doc.css(".team-home.teams").map { |el| el.text.strip }
end

这将返回一个数组,其中包含与您的选择器匹配的元素的文本,去掉空白和换行符。此时,您可以遍历返回的数组并将每个团队作为参数传递给模型的create方法:

get_teams.each { |team| Fixture.create(home_team: team) }
于 2013-03-11T22:00:48.283 回答