2011-10-28 29 views
6

Sto creando una piccola app per me stesso in cui eseguo uno script Ruby e salvo tutte le immagini del mio blog.Salva tutti i file di immagine da un sito web

Non riesco a capire come salvare i file di immagine dopo che li ho identificati. Qualsiasi aiuto sarebbe molto apprezzato.

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

url = '[my blog url]' 
doc = Nokogiri::HTML(open(url)) 

doc.css("img").each do |item| 
    #something 
end 
+0

Questo è veramente correlato alle rotaie? –

risposta

25
URL = '[my blog url]' 

require 'nokogiri' # gem install nokogiri 
require 'open-uri' # already part of your ruby install 

Nokogiri::HTML(open(URL)).xpath("//img/@src").each do |src| 
    uri = URI.join(URL, src).to_s # make absolute uri 
    File.open(File.basename(uri),'wb'){ |f| f.write(open(uri).read) } 
end 

Utilizzando il codice per convertire in percorsi assoluti da qui: How can I get the absolute URL when extracting links using Nokogiri?

+0

Ricevo un errore quando lo uso. "Conversione di output non riuscita a causa di errore conv, byte 0xFF 0xC3 0x98 0xC3" – Farhad

-1
system %x{ wget #{item['src']} } 

Edit: Questo è supponendo che si sta su un sistema UNIX con wget :) Edit 2: codice aggiornato per afferrare lo src img da nokogiri.

+0

Questo non gestisce i percorsi delle immagini relative. – Phrogz

1

assumendo l'attributo src è un URL assoluto, forse qualcosa di simile:

if item['src'] =~ /([^\/]+)$/ 
    File.open($1, 'wb') {|f| f.write(open(item['src']).read)} 
end 
+0

Cosa significa/(^ \ /] +) $/significa? –

+0

@ZackShapiro Espressione regolare che corrisponde a "uno o più caratteri che non sono una barra diretta, a patto che tocchino la fine della stringa"; in questo caso, @pguardiario lo sta usando per ottenere il nome del file in modo tale che '$ 1' possa essere usato per salvare un file con quel nome. È una forma geniale della parte 'File.basename (uri)' della mia risposta. – Phrogz

1

Suggerimento: c'è una semplice modo per ottenere immagini dalla testa/corpo di una pagina usando la gemma Scrapifier. La cosa interessante è che puoi anche definire quale tipo di immagine vuoi che venga restituito (jpg, png, gif).

fare un tentativo: https://github.com/tiagopog/scrapifier

Spero che ti piace.

Problemi correlati