2014-02-19 3 views
0

Так у меня есть следующие Nokogiri грабель задача:Rails Nokogiri Получить оба канал Название и пункт Название

require 'nokogiri' 
require 'open-uri' 

namespace :rss do 
    desc "Fetch rss feed" 
    task :fetch => :environment do 
    doc = Nokogiri::XML(open("http://www.themusicvoid.com/feed")) 
    @info = doc.xpath('//item').take(5).map do |i| 
     News.create(:title => i.xpath('title').inner_text) 
    end 
    end 
end 

Это заставляет меня название для каждого «Пункта» ... но я также хотел бы каждую запись базы данных чтобы содержать имя канала в строке под названием «сайт».

Так что-то вроде:

News.create(:title => i.xpath('title').inner_text, :site => i.xpath('channeltitle').inner_text) 

Я просто совершенно не уверены в том, чтобы это произошло. Поскольку и название канала, и название элемента являются «заголовком», я не совсем уверен, как заставить Нокигири различать эти два. Я знаю, что мне пришлось бы включать «// канал» где-то в xpath, но я не совсем уверен, как я могу получить нокогири, чтобы вызвать один «itemtitle» и другой «channeltitle». Любая помощь будет оценена по достоинству.

ответ

0

Учитывая, что название канала одинаково для всех элементов, вы должны иметь возможность получить название канала из doc, а затем использовать его во время итерации каждого item.

Вы могли бы получить титул с помощью:

channel_title = doc.at_xpath('rss/channel/title').inner_text 

И затем использовать его в течение итерации каждого элемента:

require 'nokogiri' 
require 'open-uri' 

namespace :rss do 
    desc "Fetch rss feed" 
    task :fetch => :environment do 
    doc = Nokogiri::XML(open("http://www.themusicvoid.com/feed")) 
    channel_title = doc.at_xpath('rss/channel/title').inner_text 
    @info = doc.xpath('//item').take(5).map do |i| 
     News.create(:title => i.xpath('title').inner_text, :site => channel_title) 
    end 
    end 
end 
+0

Сладкое! Благодарю. Но в конечном итоге у меня будет несколько каналов. Итак, как я могу отформатировать это, чтобы получить «сайт» для каждого фида? –

+0

Вы имеете в виду, что в одном канале будет несколько каналов (например, 'http: // www.themusicvoid.com/feed' будет иметь несколько канальных узлов) или что вы будете проходить через несколько страниц (например, http: // www.themusicvoid.com/feed' и 'http: // www.anothersite.com/feed')? –

+0

Несколько страниц: musicvoid.com/feed и anothersite.com/feed. –

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