2010-12-10 8 views
2

Ich habe endlos nach einer Lösung für dieses gesucht und ich dachte, dass ich es gelöst hatte, als ich ein Bild anzeigte. Das Thumbnail war jedoch nur das im Wurzelelement gespeicherte Thumbnail. Ganz einfach das funktioniert:Ruby, mit Nokogiri und Medien: thumbnail

rss = Nokogiri::XML(open('http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml')) 
@news = rss.xpath('//item').map do |i| 
    { 
    'title'  => i.xpath('title').text, 
    'link'  => i.xpath('link').text, 
    'description' => i.xpath('description').text, 
    'thumbnail' => i.xpath('//media:thumbnail').attr('url') 
    } 
end 

Aber die Bearbeitung der Medien: Thumbnail zu verweisen, dass Artikel scheint es zu brechen:

{ 
    'title'  => i.xpath('title').text, 
    'link'  => i.xpath('link').text, 
    'description' => i.xpath('description').text, 
    'thumbnail' => i.xpath('media:thumbnail').attr('url') 
} 

Ich verstehe nicht, warum da beide Elemente identisch sind. Alle Hinweise in die richtige Richtung würden geschätzt werden.

Danke!

+0

Ohne Eingabe Beispiel und XPath Ausdruck Frage, dies ist nicht eine 'xpath' Frage, sondern spezifische Sprache (Ruby) Klassenmethode Frage. –

Antwort

1

Ihr Code bricht beim ersten Element ab, das kein untergeordnetes Miniaturelement hat. Versuchen Sie folgendes:

@news = rss.xpath('//item').map do |i| 
    thumb = i.at_xpath('media:thumbnail').attr('url') if i.at_xpath('media:thumbnail') 
    { 
    'title' => i.at_xpath('title').text, 
    'link' => i.at_xpath('link').text, 
    'description' => i.at_xpath('description').text, 
    'thumbnail' => thumb 
    } 
end 

Jetzt thumbnail entweder die URL, wenn es oder nil liegt vor, wenn es nicht der Fall ist.

+0

Hey! Vielen Dank dafür, ich dachte, es gäbe ein Thumbnail-Attribut für jeden, aber offensichtlich nicht, großartige Lösung und alles funktioniert jetzt perfekt: D –

+0

Für den Fall, dass irgendjemand dies in der Zukunft findet, musste ich hinzufügen: außer! Thumb.nil ? \t thumb = 'missing.jpg' \t Ende –

+0

Das könnte auch kürzer geschrieben werden als 'thumbnail' => thumb || 'missing.jpg' –

0

Nur zum Vergleich, hier einige alternative Möglichkeiten, um die Knoten mit Nokogiri zuzugreifen:

require 'ap' 
require 'open-uri' 
require 'nokogiri' 

rss = Nokogiri::XML(open('http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/front_page/rss.xml')) 

# check for parsing errors... 
puts "Errors exist" if (rss.errors.any?) 

# use CSS accessors for simplicity... 
news = rss.search('item').map { |i| 

    # use CSS's namespace wildcard... 
    thumbnail = i.at('media|thumbnail') 
    begin 
    url = thumbnail['url'] 
    rescue 
    url = '' 
    end 
    { 
    'title'  => i.search('title').text, 
    'link'  => i.search('link').text, 
    'description' => i.search('description').text, 
    'thumbnail' => url 
    } 
} 

ap [*news[0 .. 1], *news[-2 .. -1]] 
# >> [ 
# >>  [0] { 
# >>    "title" => "Royal attack 'not down to radios'", 
# >>    "link" => "http://www.bbc.co.uk/go/rss/int/news/-/news/uk-11975280", 
# >>   "description" => "Police deny that a car carrying the Prince of Wales was caught up in student protests because of a breakdown in radio communications.", 
# >>   "thumbnail" => "http://news.bbcimg.co.uk/media/images/50372000/jpg/_50372715_010819577-1.jpg" 
# >>  }, 
# >>  [1] { 
# >>    "title" => "Pope Anglican offer 'dented ties'", 
# >>    "link" => "http://www.bbc.co.uk/go/rss/int/news/-/news/uk-11974543", 
# >>   "description" => "Britain's ambassador to the Vatican feared a backlash over the Pope's invitation to Anglicans to switch churches, according to leaked US cables.", 
# >>   "thumbnail" => "http://news.bbcimg.co.uk/media/images/48697000/jpg/_48697938_007958675-1.jpg" 
# >>  }, 
# >>  [2] { 
# >>    "title" => "Playing defence", 
# >>    "link" => "http://news.bbc.co.uk/go/rss/int/news/-/1/hi/programmes/from_our_own_correspondent/9275324.stm", 
# >>   "description" => "The friendly face of township where honeymoon bride was killed", 
# >>   "thumbnail" => "http://news.bbcimg.co.uk/media/images/50385000/jpg/_50385343_football_afp.jpg" 
# >>  }, 
# >>  [3] { 
# >>    "title" => "Newspaper review", 
# >>    "link" => "http://www.bbc.co.uk/go/rss/int/news/-/news/uk-11975338", 
# >>   "description" => "Papers reflect on attack on royal car", 
# >>   "thumbnail" => "http://news.bbcimg.co.uk/media/images/49254000/jpg/_49254932_efb006dc-dd09-47bd-8f2d-37752152f772.jpg" 
# >>  } 
# >> ] 

Beachten Sie die Verwendung des CSS-Namespace-Platzhalter. Es kann Ihr Leben viel einfacher machen, wenn Sie Namespaces im Dokument nicht interessieren und alles verarbeiten möchten.

+0

Danke dafür, hilft mir zu erkennen, wie viele Möglichkeiten es gibt, aus irgendeinem Grund funktionierte das nicht für mich, obwohl ich noch war Keine Fehler bekommen. –

Verwandte Themen