我需要使用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将它们序列化到磁盘以便以后上传。
答案 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方法直接下载它们。