2015-01-29 10 views
5

Sto raschiando un sito e non riesco a ottenere le immagini, perché sono caricate con CSS immagine di sfondo.Ottieni un'immagine di sfondo con Nokogiri dal DOM?

C'è un modo per ottenere questi attributi con Nokogiri senza dover utilizzare Phantom.js o Sentinel? L'immagine di sfondo usa effettivamente gli stili inline, quindi dovrei essere in grado di farlo.

devo ottenere le immagini da un array di URL:

<div class="zoomLens" style="background-image: url(http://resources1.okadirect.com/assets/en/new/catalogue/1200x1200/EHD005MET-L_01.jpg?version=7); background-position: -14.7368421052632px -977.894736842105px; background-repeat: no-repeat;">&nbsp;</div> 

sto usando Nokogiri via Mechanize, ma non sanno come scrivere correttamente questo:

image = agent.get(doc.parser.at('.zoomLens')["background-image"]).save("okaimages/f_deco-#{counter}.jpg") 

risposta

5

I' d utilizzare qualcosa come:

require 'nokogiri' 

doc = Nokogiri::HTML('<div class="zoomLens" style="background-image: url(http://resources1.okadirect.com/assets/en/new/catalogue/1200x1200/EHD005MET-L_01.jpg?version=7); background-position: -14.7368421052632px -977.894736842105px; background-repeat: no-repeat;">&nbsp;</div>') 

doc.search('.zoomLens').map{ |n| n['style'][/url\((.+)\)/, 1] } 
# => ["http://resources1.okadirect.com/assets/en/new/catalogue/1200x1200/EHD005MET-L_01.jpg?version=7"] 

Il trucco è il modello appropriato per afferrare il contenuto della parentesi. n['style'][/url\((.+)\)/, 1] utilizza String#[] che può assumere un'espressione regolare con il raggruppamento e restituire un determinato gruppo dalle acquisizioni. Vedi https://www.regex101.com/r/mV6rY6/1 per una ripartizione di ciò che sta facendo.

A quel punto si sarebbe seduti su una serie di URL di immagini. Puoi facilmente scorrere l'elenco e utilizzare OpenURI o qualsiasi altro numero di client HTTP per recuperare le immagini.

+0

La cosa è che ho bisogno di questo per lavorare con percorsi dinamici che ho in un array (ho circa 3000), quindi questo codice non cambierà per ognuno? – Gibson

+1

Allora hai davvero bisogno di scrivere una domanda che rispecchi quella giusta? Possiamo solo rispondere in base a ciò che ci hai detto e che non era parte del tuo contributo o menzionato come specifica. Dicendoci un po ', poi cambiare e fare una domanda diversa, ecc., Non va bene. Metti tutto a posto all'inizio. –

+0

Mi dispiace, lo specificherà. – Gibson