2016-07-12 7 views
0

Мне нужно получить все изображения, представленные под определенным div, используя Ruby and Mechanize. Соответствующая структура DOM выглядит следующим образом:Извлечение изображений под определенным Div с Механизмом и Рубином

<div id="item_img"> 
<a href="JavaScript:imageview('000000018693.jpg')"> 
<img src="/shop/doubleimages/0000000186932.jpg" border="0" width="500" height="500" alt="関係ないコメント z1808"> 
</a> 
<img src="/shop/doubleimages/000000018693_1.jpg"><br><br> 
<img src="/shop/doubleimages/000000018693_2.jpg"><br><br> 
<img src="/shop/doubleimages/000000018693_3.jpg"><br><br> 
</div> 

Итак, я сначала получил все изображения после раскручивания нового агента, выполнив:

agent = Mechanize.new 
agent.user_agent_alias = 'Mac Safari' 
page = agent.get ('http://double14.com/shopdetail/000000018693/') 
puts page.images 

Это было приятно, но каждое изображение на странице (как и должно быть), и, похоже, вычеркивает div id над ним, что делает невозможным решение, что происходит от того места. В результате у меня было все изображения на странице (нет буено).

я получил его вниз к этому:

agent = Mechanize.new 
agent.user_agent_alias = 'Mac Safari' 
page = agent.get ('http://double14.com/shopdetail/000000018693/') 
node = page.search "#item_img img" 
    node.each do |n| 
    puts n.attributes['src'] 
end 

К сожалению, выводит следующее -

/shop/doubleimages/0000000186932.jpg 
/shop/doubleimages/000000018693_1.jpg 
/shop/doubleimages/000000018693_2.jpg 
/shop/doubleimages/000000018693_3.jpg 

Есть ли способ, чтобы взять полный URL и использовать вместо? В конечном счете, я хотел бы сохранить эти изображения в базе данных, но мне нужен полный URL-адрес для их сериализации на диск для последующей загрузки.

+2

Не могли бы вы просто добавить хост, например 'http: // double14.com/shop/doubleimages/0000000186932.jpg'? –

+0

Я думал, что может быть способ взять полное имя пути с сайта, чтобы я мог вообще избегать относительных имен пути. Если это все, что есть, то это звучит как действительное решение. Спасибо. – JapanRob

ответ

0

Да. Вы можете получить полный URL для изображений с помощью метода #resolve:

require 'mechanize' 

mechanize = Mechanize.new 
mechanize.user_agent_alias = 'Mac Safari' 

page = mechanize.get('http://double14.com/shopdetail/000000018693/') 

page.search('#item_img img').each do |img| 
    puts mechanize.resolve(img['src']) 
end 

В качестве альтернативы вы можете использовать метод #download, чтобы загрузить их.

0

Так я сделал это для коллекции изображений. В этом случае base_uri - это URL, который вы передаете, чтобы получить. Дайте знать, если у вас появятся вопросы.

def self.qualify_images(base_uri, images) 
    images.map do |image| 
     next unless has_src?(image) 
     qualify_image(base_uri, image) 
    end.compact 
    end 

    def self.qualify_image(base_uri, image) 
    src = image.attributes["src"].value 
    if src =~ /^\/[\/]/ 
     result = "#{scheme(base_uri)}#{src}" 
    elsif src =~ /^\// 
     result = "#{base_uri}#{src}" 
    else 
     result = src 
    end 
    http?(result) ? result : nil 
    end 

    def self.has_src?(image) 
    image.attributes["src"].value 
    rescue NoMethodError 
    false 
    end 

    def self.scheme(uri) 
    uri = URI.parse(uri) 
    "#{uri.scheme}:" 
    end 

    def self.http?(uri) 
    uri = URI.parse(uri) 
    uri.kind_of?(URI::HTTP) 
    rescue URI::InvalidURIError 
    false 
    end 

Это обеспечит полный ури для каждого изображения.

0

Это будет выглядеть примерно так:

page.search("#item_img img").each do |img| 
    puts page.uri.merge(img[:src]).to_s 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^