从URL访问的XML文件格式错误的Nokogiri解析?

时间:2013-12-13 17:58:59

标签: ruby-on-rails ruby xml nokogiri

目前我正在尝试解析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中找到的节目标题,其余部分将在完成后显示。

1 个答案:

答案 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”。