2012-10-15 72 views
1

http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml回报,除其他外,这些行:抓住XML-的XPath通过属性

(...) 
<media:content url="http://x4100mp4dynonlc22033.f.o.l.lb.core-cdn.net/22033mdr/ondemand/4100mp4dynonl/FCMS-066eb3e7-81b2-4dae-898d-4963137eb4b6-e9ebd6e42ce1.mp4" type="video/mpeg" expression="full" width="512" height="288" bitrate="512" duration="398" /> 
<media:content url="http://x4100mp4dynonlc22033.f.o.l.lb.core-cdn.net/22033mdr/ondemand/4100mp4dynonl/FCMS-066eb3e7-81b2-4dae-898d-4963137eb4b6-c7cca1d51b4b.mp4" type="video/mpeg" expression="full" width="960" height="544" bitrate="1536" duration="398" /> 
(...) 

我怎么会告诉引入nokogiri只提取行,其中bitrate="1536"

其实我只是需要一个的XPath内的URL,所以我希望(我觉得很粗鲁地写“期待”在这里,但我被告知这样做;)下列字符串返回:

http://x4100mp4dynonlc22033.f.o.l.lb.core-cdn.net/22033mdr/ondemand/4100mp4dynonl/FCMS-066eb3e7-81b2-4dae-898d-4963137eb4b6-c7cca1d51b4b.mp4 

如果有人有兴趣,这将允许我下载德国电视小孩Sandmännchen的每日插曲。 :)

到目前为止,我已经使用simpleRSS这种尝试:

(...) 
rss.entries.each do |entry| 
    pp entry 
end 

但是,只有返回的链接media:group “设定” 的第一个项目:

{:title=>"Sandmann vom 14. Oktober 2012", 
:link=>"http://www.mdr.de/export/sandmann/folgen/video78338.html", 
:description=> 
    "Die j\xC3\xBCngste Geschichte vom Sandmann gibt es f\xC3\xBCr 24 Stunden hier auf Abruf. Heute: Molly mag keine Schuhe. Das finden die anderen Monster merkw\xC3\xBCrdig, weil Monster Schuhe lieben.", 
:pubDate=>2012-09-19 14:54:43 +0200, 
:guid=> 
    "mp4:4100mp4dynonl/FCMS-066eb3e7-81b2-4dae-898d-4963137eb4b6-8442e17c3177", 
:media_content_url=> 
    "rtmp://x4100mp4dynonlc22033.f.o.f.lb.core-cdn.net/22033mdr/ondemand", 
:media_content_type=>"fms/h264", 
:media_content_height=>"272", 
:media_content_width=>"480", 
:media_title=>"Sandmann vom 14. Oktober 2012", 
:media_thumbnail_url=> 
    "http://www.mdr.de/export/sandmann/folgen/sandmann864_v-standard43_zc-698fff06.jpg", 
:media_thumbnail_height=>"135", 
:media_thumbnail_width=>"180"} 
+0

这似乎是有关,但在短短的解析RSS的方面需要解答:http://stackoverflow.com/questions/2268224/do-any-ruby-rss-parsing-libaries-support -mrss – Christian

回答

1

如何:

doc.at_xpath('//media:content[@bitrate="1536"]/@url').text 
#=> "http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss__zc-1a3071ad.xml" 

该链接的方式不起作用,所以我实际上并没有能够测试这在完整的文件上。

UPDATE

使用从下面你的答案的信息,在引入nokogiri:

filme = Nokogiri::XML(open('http://www.sandmann.de/static/san/app/filme.xml')) 
folge = Nokogiri::XML(open(filme.xpath('//filme/folge').text)) 

folge.at_xpath('//media:content[@bitrate="1536"]/@url').text 
#=> "http://x4100mp4dynonlc22033.f.o.l.lb.core-cdn.net/22033mdr/ondemand/4100mp4dynonl/FCMS-066eb3e7-81b2-4dae-898d-4963137eb4b6-c7cca1d51b4b.mp4" 
+0

'http:// www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml' - 他们是否改变了它? – Christian

+0

'doc2 = Nokogiri :: XML(open('http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml')) puts doc2.at_xpath('// content [@bitrate =“1536”]/@ url')。text'返回未定义的方法\'text'为nil:NilClass(NoMethodError)' – Christian

+0

我收到一个“Seite nicht gefunden”页面。 –

0

这是我想出了到底 - 没有nokogiri(其中,我认为,是非常强大,但学习曲线相当陡峭,另外,我根本不明白它......)而是crack。这似乎是更rubyish并与MRSS供稿我得到很好的发挥沿着:

require 'rubygems' 
require 'pp' 
require 'crack' 
require 'asciify' 
require 'open-uri' 

fileurl = "" 
filme = Crack::XML.parse(open('http://www.sandmann.de/static/san/app/filme.xml')) 
folge = Crack::XML.parse(open(filme['filme']['folge'])) 
titel = folge['rss']['channel']['item']['description'].to_s.sub(/.*Die jüngste Geschichte vom Sandmann gibt es für 24 Stunden hier auf Abruf. Heute: /, '') 
folge['rss']['channel']['item']['media:group']['media:content'].each do |x| 
    fileurl << x['url'] if x['bitrate'] == "1536" 
end 
filename = titel.split(".").first.asciify + ".m4v" 
filename.gsub!(" ","_") 

system("curl -o \"#{filename}\" \"#{fileurl}\"") 

万一孩子想看,也;)

+0

更新了我上面的答案。它在nokogiri中有效,我只是在xpath中缺少了一些东西。 –

+0

啊 - 现在我明白了Nokogiri背后的想法。谢谢! – Christian

+1

与nokogiri相比,这个解决方案有多难看。 – pguardiario

0

为了方便,简单地说:

doc.at('content[@bitrate="1536"]')[:url] 
+0

+1不错的CSS使Nokogiri忽略命名空间。 –

+0

谢谢,@锡文,我知道你会回答同样的事情,如果我没有击败你:) – pguardiario

+0

这是行不通的。 'p Nokogiri.XML('').at('c [@ x =“1”]')#=> nil'。这个查询不仅混合了CSS和XPath语法,如果你想让它工作,你需要'remove_namespaces!'。 – Phrogz

0
require 'nokogiri' 
require 'open-uri' 

url = 'http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml' 
doc = Nokogiri.XML(open(url)) 
doc.remove_namespaces! # Just to make our life simpler 
content = doc.at_css('content[bitrate="1536"]') 
puts content['url'] 
#=> http://x4100mp4dynonlc22033.f.o.l.lb.core-cdn.net/22033mdr/ondemand/4100mp4dynonl/FCMS-fd2af820-ec90-4f34-a58e-db1b9fdcc25a-c7cca1d51b4b.mp4