Ruby 按属性获取xml xpath

Ruby 按属性获取xml xpath,ruby,xml,nokogiri,Ruby,Xml,Nokogiri,http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml除返回其他行外,还返回以下行: (...) <media:content url="http://x4100mp4dynonlc22033.f.o.l.lb.core-cdn.net/22033mdr/ondemand/4100mp4dynonl/FCMS-066eb3e7-81b2-4dae-898d-4963137eb4

http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml
除返回其他行外,还返回以下行:

(...)
<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" />
(...)
如果有人感兴趣,这将允许我下载德国儿童电视迷你剧《桑姆森》的每日一集

到目前为止,我已经尝试使用了
simplers

(...)
rss.entries.each do |entry|
    pp entry
end
但这只返回
媒体组
链接“集合”的第一项:

{: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"}
这个怎么样:

doc.at_xpath('//media:content[@bitrate="1536"]/@url').text
#=> "http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss__zc-1a3071ad.xml"
顺便提一下,这个链接不起作用,所以我实际上无法在完整的文档中测试它

更新

使用以下答案中的信息,在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"
这个怎么样:

doc.at_xpath('//media:content[@bitrate="1536"]/@url').text
#=> "http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss__zc-1a3071ad.xml"
顺便提一下,这个链接不起作用,所以我实际上无法在完整的文档中测试它

更新

使用以下答案中的信息,在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"

这就是我最后想到的-没有
nokogiri
(我认为它非常强大,但有一个相当陡峭的学习曲线。另外,我根本不理解它…)而是
破解
。它看起来更红,与我得到的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}\"")
需要“rubygems”
需要“pp”
需要“破解”
需要“ascify”
需要“打开uri”
fileurl=“”
filme=Crack::XML.parse(打开)http://www.sandmann.de/static/san/app/filme.xml'))
folge=Crack::XML.parse(打开(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']|

fileurl这就是我最后想到的-no
nokogiri
(我认为它非常强大,但有一个相当陡峭的学习曲线。另外,我根本不理解它…)但是
crack
。它看起来更红,与我得到的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}\"")
需要“rubygems”
需要“pp”
需要“破解”
需要“ascify”
需要“打开uri”
fileurl=“”
filme=Crack::XML.parse(打开)http://www.sandmann.de/static/san/app/filme.xml'))
folge=Crack::XML.parse(打开(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']|

fileurl为了简化操作,只需:

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

要使操作简单,只需:

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


这似乎与RSS解析相关,但尚未回答:这似乎与RSS解析相关,但尚未回答:
http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml
-他们刚刚更改了吗<代码>doc2=Nokogiri::XML(开放式)http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml“))将doc2.at_xpath(“//content[@bitrate=“1536”]/@url”).text
为nil:NilClass(NoMethodError)返回
未定义的方法“text”
我得到一个“Seite nicht gefunden”页面。你确定
doc2
有你正在搜索的标签,而不仅仅是“Seite nicht gefunden”页面吗?它们似乎每隔一段时间就会更改相关的URL,请参阅上面的内容,了解从何处获取当前代码。
http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml
-他们刚刚更改了吗<代码>doc2=Nokogiri::XML(开放式)http://www.mdr.de/export/sandmann/folgen/sandmann612-mediaRss_doca-1_zc-1a3071ad.xml“))将doc2.at_xpath(“//content[@bitrate=“1536”]/@url”).text
为nil:NilClass(NoMethodError)返回
未定义的方法“text”
我得到一个“Seite nicht gefunden”页面。你确定
doc2
有你正在搜索的标签,并且不仅仅是“Seite nicht gefunden”页面吗?他们似乎每隔一段时间就会更改相关的URL,请参见上面的获取当前标签的位置。更新了上面的我的答案。它在nokogiri中工作,我只是在xpath中缺少了一些东西。啊-现在我明白了nokogiri背后的想法。谢谢与nokogiri相比,这个解决方案的丑陋程度几乎让人害怕。nokogiri为什么不是“rubysh”?我发现Crack访问xml结构的方式比nokogiri的可读性强得多。我更新了上面的答案。它在nokogiri中工作,我只是在xpath中缺少了一些东西。啊-现在我明白了nokogiri背后的想法。谢谢与nokogiri相比,这个解决方案的丑陋程度几乎令人恐惧。nokogiri为什么不是“rubysh”?事实上,我发现Crack访问xml结构的方式比nokogiri的方式可读性好得多。谢谢,@the Tin Man,我知道如果我没有打败你,你也会回答同样的问题:)这行不通
p Nokogiri.XML(“”).at('c[@x=“1”]”)#=>nil
。该查询不仅混合了CSS和XPath语法,还需要
删除\u名称空间p Nokogiri.XML(“”).at('c[@x=“1”]”)#=>nil
。该查询不仅混合了CSS和XPath语法,还需要
删除\u名称空间如果你想让它工作。