2013-03-14 4 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

+0

извинения, ссылка на URL-адрес, обновленный в вопросе – Richlewis

ответ

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 с прочь и дома команд для каждого матча.

Edit:

Добавлено .text.strip

Edit 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 для вызова следующий элемент HTML после тега h2, содержащего дату.

Он перебирает все h2 HTML-тегов в HTML div#fixtures-data затем захватывает table тега непосредственно ниже/после каждого h2.

+0

Удивительно, что работает, теперь понимающая часть ... поэтому tr.preview содержит информацию о совпадении, затем мы просматриваем каждый просмотр, захватывая домашнюю команду и информацию о команде, а затем создаем просто позволяет нам чтобы создать запись в модели, если бы вы могли объяснить что-нибудь, что было бы замечательно, что было бы здорово – Richlewis

+0

Звучит прямо для меня :). 'tr.preview' захватывает все строки таблицы соответствия/fixture и по существу создает массив, содержащий HTML изнутри каждая строка 'tr.preview'. Цикл захватывает каждый фрагмент строки HTML из массива и запрашивает его дальнейший поиск '.team-home' и' .team-away'. – Sam

+0

, так что я думал об этом неправильно, спасибо за то, что вы меня поняли, быстрый вопрос, если я захочу захватить светильники, включая дату, могу ли я следовать аналогичным шаблонам, создающим match = doc.css ".fixtures-table full- table-medium "), тогда я мог бы перебирать содержимое внутри этого? – Richlewis

Смежные вопросы