2015-01-29 19 views
5

Bir siteyi kazıyorum ve görüntüleri alamıyorum çünkü bunlar arka plan resmi CSS ile yüklendi.DOM'dan Nokogiri ile arka plan resmi al?

Bu öznitelikleri, Noktomiri ile Phantom.js veya Sentinel kullanmadan almak için bir yolu var mı? Arka plan resmi aslında satır içi stilleri kullanır, böylece yapabilmem gerekir.

Ben URL'ler bir dizi görüntüleri almak zorunda:

<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> 

Ben makineleştirmek aracılığıyla Nokogiri kullanıyorum, ancak doğru bu yazma bilmiyorum:

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

cevap

5

Ben gibi bir şey kullanmak d:

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"] 

hile parantez içeriğini kapmak için uygun kalıptır. n['style'][/url\((.+)\)/, 1]String#[]'u kullanarak gruplandırmayla düzenli bir ifade alabilir ve yakalardan belirli bir grubu döndürebilir. Yaptıklarının bir dökümü için https://www.regex101.com/r/mV6rY6/1'a bakın.

Bu noktada, bir dizi resim URL'sinde oturuyor olacaksınız. Listede kolayca yineleyebilir ve görüntüleri almak için OpenURI veya başka bir sayıdaki HTTP istemcisini kullanabilirsiniz.

+0

Bir dizide sahip olduğum dinamik rotalarla çalışmak için buna ihtiyacım var (yaklaşık 3000 tane var), bu yüzden bu kod her biri için değişecek mi? – Gibson

+1

O zaman gerçekten bu hakkı yansıtan bir soru yazmanız gerekiyor mu? Sadece bize ne anlattığınıza göre cevap verebiliriz, bu sizin girdinizin bir parçası değildi ya da bir spekülatif olarak belirtilmişti. Bize biraz söylemek, sonra değişmek ve farklı bir soru sormak vb. Iyi değildir. Her şeyi önce koy. –

+0

Bunun için üzgünüz, belirteceksin. – Gibson