2013-03-14 47 views
1

慢慢地到达那里,我试图实现。我通过屏幕抓取抓取数据,并希望将数据保存到我的模型中,我有两列,home_team和away_team。到目前为止,我抓住了数据。将散列的内容保存到模型

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

def get_fixtures # Get me all Home and away Teams 
doc = Nokogiri::HTML(open(FIXTURE_URL)) 
home_team = doc.css(".team-home.teams").map {|h| h.text.strip } 
away_team = doc.css(".team-away.teams").map {|a| a.text.strip } 
#team_clean = Hash[:home_team => home_team, :away_team => away_team] 
#team_clean = Hash[:team_clean => [Hash[:home_team => home_team, :away_team => away_team]]] 
end 

我已经散列了获取数据到一个哈希的方式有两种,一种是散,另一个是散列中的散列,我不知道我需要哪一个(如果有的话?)

所以,如果我想保存从我HOME_TEAM接收到的数据我运行耙子任务来完成

def update_fixtures #rake task method 
Fixture.destroy_all 
get_fixtures.each {|home| Fixture.create(:home_team => home)} 
end 

我想要实现的是能够节省HOME_TEAM和AWAY_TEAM在同一时间。我是否需要访问哈希中的数据,如果是这样的话?这里有点失落,但是这是我第一次尝试这种

任何帮助表示赞赏

+0

你可以发布一些HTML或链接到FIXTURE_URL吗? – Sam 2013-03-14 11:44:57

+0

道歉,链接到更新的网址 – Richlewis 2013-03-14 11:46:51

回答

2

试试这个,

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

def get_fixtures # Get me all Home and away Teams 
    doc = Nokogiri::HTML(open(FIXTURE_URL)) 
    matches = doc.css('tr.preview') 
    matches.each do |match| 
    home_team = match.css('.team-home').text.strip 
    away_team = match.css('.team-away').text.strip 
    Fixture.create!(home_team: home_team, away_team: away_team) 
    end 
end 

这将遍历匹配,并与远及家庭创建一个新的Fixture每场比赛的球队。

编辑:

新增.text.strip

编辑2:

这应该让你的日期也

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

def get_fixtures # Get me all Home and away Teams 
    doc = Nokogiri::HTML(open(FIXTURE_URL)) 
    days = doc.css('#fixtures-data h2').each do |h2_tag| 
    date = Date.parse(h2_tag.text.strip) 
    matches = h2_tag.xpath('following-sibling::*[1]').css('tr.preview') 
    matches.each do |match| 
     home_team = match.css('.team-home').text.strip 
     away_team = match.css('.team-away').text.strip 
     Fixture.create!(home_team: home_team, away_team: away_team, date: date) 
    end 
    end 
end 

这是一个有点比以前更复杂因为它必须使用一些XPath来调用h2标签之后的下一个HTML元素包含日期。

它通过循环在div#fixtures-data HTML所有h2 html标签则每个h2后抓住table标签下方/。

+0

惊人的作品,现在的理解部分...所以tr.preview保存了比赛信息,然后我们通过每次预览抓住主队和客队信息,然后创建只是让我们在模型中创建一个记录,如果你能解释任何我已经歪曲的东西,那就太好了 – Richlewis 2013-03-14 12:00:43

+0

听起来对我来说:)'tr.preview'抓取所有匹配/夹具表行,并从本质上创建一个包含内部HTML的数组每个'tr.preview'行。循环抓取数组中的每个HTML行片段,并进一步查询“.team-home”和“.team-away”。 – Sam 2013-03-14 12:14:07

+0

所以我这样做是错误的方式,谢谢你为我清理,快速问题,然后,如果我想抓住包括日期在内的装置,我可以按照类似的模式进行匹配= doc.css“.fixtures-table full-表中“),那么我可以循环内的内容? – Richlewis 2013-03-14 12:18:01