使用Mechanize和Ruby检索特定Div下的图像

时间:2016-07-12 20:21:19

标签: ruby image mechanize

我需要使用Ruby和Mechanize检索特定div下的所有图像。相关的DOM结构如下:

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

这很好,但它在页面上的每个图像(应该如此),并且似乎剥离了它上面的div id,使得无法确定来自哪里。结果,我在页面上有了每个图像(没有bueno)。

我明白了这一点:

<CheckBoxPreference 
    android:key="Show_Dialog"  
    android:defaultValue="true" />

不幸的是,这会输出以下内容 -

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    Boolean showDlg = sharedPref.getBoolean("Show_Dialog", true);

有没有办法获取完整的网址并使用它?最后,我想将这些图像保存到数据库中,但我需要完整的URL将它们序列化到磁盘以便以后上传。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

它看起来像:

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

答案 2 :(得分: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方法直接下载它们。