目前我正在尝试解析BBC提供的XML文档。然而,我正在对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
中找到,其余的将在完成后显示。
我不会给你答案,因为看起来你并没有试图阅读Nokogiri的文档。
我要做的是为您指明大致方向:
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
(查找所有匹配节点)来执行此操作。
另请参阅"如何避免在抓取时连接来自节点的所有文本"。