目前我正在尝试解析BBC提供的XML document。但是,我正在对Ruby实际获得的内容进行简单的检查,并且它似乎缺少很多细节。
require 'open-uri'
require 'nokogiri'
class MainController < ApplicationController
def index
@xml = Nokogiri::XML(open("http://www.bbc.co.uk/bbcone/programmes/schedules/scotland/2013/12/13.xml"))
render :text => @xml
end
end
我从输出中获得的所有内容(截断大小)都是一堆不连贯的文本:
p01ml65v 2013-12-13T00:20:00Z 2013-12-13T00:25:00Z 300 b03ktclr Detailed weather forecast. audio_video 300 p01lc1h3 Skiing Weatherview 2013-12-13T00:20:00Z b007yy70 2007-09-02T01:50:00+01:00 0 0 p01ml65w 2013-12-13T00:25:00Z 2013-12-13T06:00:00Z 20100 b03ktclt BBC One joins the BBC's rolling news channel for a night of news. audio_video 20100 p01m1rbq 13/12/2013 2013-12-13T00:25:00Z b00h9fxh 2006-04-05T00:20:00+01:00 0 0 p01ml966 2013-12-13T06:00:00Z 2013-12-13T09:15:00Z 11700 b03ktcn1
它也失去了很多孩子。你能谈谈我如何处理这个问题吗?
目前的最终目标只是显示最初在树节点/schedule/day/broadcasts/broadcast/programme/display_titles/title
中找到的节目标题,其余部分将在完成后显示。
答案 0 :(得分:0)
我不打算给你一个答案,因为你看起来不像是在尝试阅读Nokogiri's documentation。
我将做的是指向大方向:
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::XML(open("http://www.bbc.co.uk/bbcone/programmes/schedules/scotland/2013/12/13.xml"))
episode = doc.at('programme[type="episode"]')
episode.at('title').text # => "Skiing Weatherview"
episode.at('short_synopsis').text # => "Detailed weather forecast."
doc.search('broadcast').size # => 32
doc.search('title').map(&:text).uniq.sort
# => ["13/12/2013",
# "14/12/2013",
# "A Question of Sport",
...
将解析后的文档作为DOM是不够的。您需要检索所需的节点。您可以使用找到第一个匹配节点的at
或找到所有匹配节点的search
来完成此操作。
另请参阅“How to avoid joining all text from Nodes when scraping”。