我正在尝试学习如何通过屏幕抓取数据,然后将其保存到模型中。到目前为止,我可以获取数据。我这样说就好像:
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
但没有任何东西得救,但这是可以预料的。
这里陡峭的学习曲线,并希望在正确的方向上推动。
答案 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) }