Как мне разобрать XML с помощью Nokogiri и разделить значение узла? - PullRequest
1 голос
/ 21 декабря 2011

Я использую Nokogiri для разбора XML.

doc = Nokogiri::XML("http://www.enhancetv.com.au/tvguide/rss/melbournerss.php")

Я не был уверен, как на самом деле правильно получить значения узлов.

Я в особенности за узлами title, link и description, которые находятся под родительскими узлами item.

<item>
    <title>Toasted TV - TEN - 07:00:00 - 21/12/2011</title>
    <link>http://www.enhancetv.com.au/tvguide/</link>
    <description>Join the team for the latest in gaming, sport, gadgets, pop culture, movies, music and other seriously fun stuff! Featuring a variety of your favourite cartoons.</description>
</item>

То, что я хотел бы сделать, - это title.split("-") таким образом, чтобы я мог преобразовать строки даты и времени в действительный DateTime объект для последующего использования в дальнейшем.

Ответы [ 3 ]

3 голосов
/ 21 декабря 2011

Поскольку это RSS-лента, вы можете рассмотреть парсер RSS:

require 'simple-rss'
require 'open-uri'

feed = 'http://www.enhancetv.com.au/tvguide/rss/melbournerss.php'
rss = SimpleRSS.parse open(feed)

rss.items.each do |item|
  puts item.title, item.link, item.description
end
2 голосов
/ 21 декабря 2011

Для примера строки заголовка, которую вы упомянули:

DateTime.parse(s.split(" - ")[-2..-1].join(" "))

Это дает вам объект DateTime: Wed, 21 Dec 2011 07:00:00 +0000

Но вы должны следить за вариациями заголовка, которые могут вам понадобитьсяиметь дело с.Немного измените разделение в соответствии с вашими потребностями.

Обновление: не заметил, что вам также нужна дополнительная информация о том, как анализировать документ.Итак, вот как:

doc = Nokogiri::XML(open("http://www.enhancetv.com.au/tvguide/rss/melbournerss.php"))
data = doc.xpath("//item").map do |item|
  [
    item.search("title").first.content,
    item.search("link").first.content,
    item.search("description").first.content
  ]
end

Это загрузит все заголовок, ссылку и описание для элементов в массиве данных.Nokogiri :: XML принимает строку в качестве содержимого документа XML, поэтому вам нужно открыть URL-адрес, а затем передать ему результат.

1 голос
/ 21 декабря 2011
def parse_time(text)
   items = text.split("-")
   DateTime.strptime("#{items[-2].strip}#{items[-1].strip}", "%H:%M:%S%d/%m/%Y")
end

content = Net::HTTP.get(URI.parse("http://www.enhancetv.com.au/tvguide/rss/melbournerss.php"))
doc = Nokogiri::XML(content){|config| config.noblanks }

doc.search("//item").map{ |node|
   node.children.inject({}) do |hash, node|
     if node.name == "title"
       #or another name
       hash["created_at"] = parse_time(node.text)
     end

     hash[node.name] =  node.text
     hash
   end
}
...