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 の結果を配列に入れる必要がありますか?

2 番目の部分は、update_db メソッドを介して一致を渡していますが、それは正しくありません。ここで何を渡すか、update_fixtures メソッドからの home_team の結果、またはメソッド自体ですか?

私が行うタスクを実行するには:

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

しかし、何も救われませんが、それは当然のことです。

ここでの学習曲線は急であり、正しい方向へのプッシュに感謝します。

4

2 に答える 2

1

Calling css(".team-home.teams").text does not return the matching DOM elements as an array, but as a single string.

In order to obtain an array of elements, refactor get fixture into something like this:

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

This will return an array containing the text of the elements matching your selector, stripped out of blank and new line characters. At this point you can loop over the returned array and pass each team as an argument to your model's create method:

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

配列を update メソッドに直接渡すだけです。

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 に答える