根据收到的数据创建一个数组

时间:2013-03-11 21:10:59

标签: ruby-on-rails arrays screen-scraping models

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

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

但没有任何东西得救,但这是可以预料的。

这里陡峭的学习曲线,并希望在正确的方向上推动。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

为了获得一个元素数组,重构得到这样的东西:

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) }