2012-10-15 73 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