2016-07-12 17 views
0

RubyとMechanizeを使用して特定のdivの下にあるすべての画像を取得する必要があります。MechanizeとRubyで特定の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> 

だから、私が最初に行うことによって、新しいエージェントをスピンアップした後、すべての画像を得た:次のように関連するDOM構造がある

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

はい。あなたは#resolve方法で画像の完全なURLを取得することができます。

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 

これにより、各画像の完全修飾されたURIが保証されます。

0

それは以下のようになります。

page.search("#item_img img").each do |img| 
    puts page.uri.merge(img[:src]).to_s 
end 
関連する問題