Как я могу использовать Nokogiri для доступа к URL из канала Atom? - PullRequest
0 голосов
/ 09 мая 2011

Я пытаюсь извлечь URL-адреса из канала XML Atom YouTube с помощью Nokogiri.

Мне повезло, когда я извлекал идентификаторы, yay пространства имен, но мне было трудно извлечь URL. Например, API YouTube предлагает три разных тега <media:thumbnail> и три разных тега <media:content>. Ниже вы можете увидеть, что URL-адреса не отображаются ни для одного из этих тегов. Моя цель - извлечь URL-адреса из первых <media:thumbnail> и <media:content> соответственно.

Вот немного моего кода: http://pastie.org/1881669

Это вывод в терминале для одной записи:

{:group=>\"ComedyThe OMG Cat or the WTF cat - funny gobsmacked cat. The cats name is \\\"Choco\\\" and if i told you what she was looking at, I would have to kill you!!!The OMG Cat, omg cat, wtf cat, cat, cats, cat fail, the wtf cat, cute cats, cute animals, funny cats, funny cat video, omg, wtf, gobsmacked cat, gobsmacked, two girls one cup, reactionThe OMG Cat\", :category=>\"Comedy\", :content=>\"\", :description=>\"The OMG Cat or the WTF cat - funny gobsmacked cat. The cats name is \\\"Choco\\\" and if i told you what she was looking at, I would have to kill you!!!\", :keywords=>\"The OMG Cat, omg cat, wtf cat, cat, cats, cat fail, the wtf cat, cute cats, cute animals, funny cats, funny cat video, omg, wtf, gobsmacked cat, gobsmacked, two girls one cup, reaction\", :player=>\"\", :thumbnail=>\"\", :title=>\"The OMG Cat\"}]"

1 Ответ

3 голосов
/ 28 июля 2011

Начиная с самого начала, делайте (в данном конкретном случае рассматривается канал XML для плейлиста YouTube, но я считаю, что вы можете сделать то же самое для любого видео-канала):

pid='5ABDCC8D096B0853' #requires a playlist id to lookup all its entries
 => "5ABDCC8D096B0853" 
doc = Nokogiri::XML(open("http://gdata.youtube.com/feeds/api/playlists/#{pid}?v=2"))   

Теперь у вас есть nokogiriXML-документ, содержащийся в переменной doc.Оттуда вы можете получить все медиа: контент и медиа: наборы миниатюр.Получив набор узлов, вы можете получить доступ к первому так же, как и к первому элементу в массиве.

doc.xpath('//media:content')[0]
 => #<Nokogiri::XML::Element:0x82dd58d8 name="content" namespace=#<Nokogiri::XML::Namespace:0x82dd5ea0 prefix="media" href="http://search.yahoo.com/mrss/"> attributes=[#<Nokogiri::XML::Attr:0x82dd5770 name="url" value="http://www.youtube.com/ep.swf?id=5ABDCC8D096B0853">, #<Nokogiri::XML::Attr:0x82dd575c name="type" value="application/x-shockwave-flash">, #<Nokogiri::XML::Attr:0x82dd5748 name="format" namespace=#<Nokogiri::XML::Namespace:0x82dd3d44 prefix="yt" href="http://gdata.youtube.com/schemas/2007"> value="5">]> 

doc.xpath('//media:content')[0]['url']

 => "http://www.youtube.com/ep.swf?id=5ABDCC8D096B0853" 

и сделайте то же самое для эскиза:

doc.xpath('//media:thumbnail')[0]['url']
 => "http://i.ytimg.com/vi/eBefgm7hdpU/default.jpg" 
...