使用 Mechanize 和 Ruby 检索特定 Div 下的图像
Retrieving images under a specific Div with Mechanize and Ruby
我需要使用 Ruby 和 Mechanize 检索特定 div 下存在的所有图像。相关DOM结构如下:
<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 将它们序列化到磁盘以供以后上传。
这就是我为一组图像所做的。在这种情况下,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。
它将看起来像:
page.search("#item_img img").each do |img|
puts page.uri.merge(img[:src]).to_s
end
是的。您可以使用 #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 方法直接下载它们。
我需要使用 Ruby 和 Mechanize 检索特定 div 下存在的所有图像。相关DOM结构如下:
<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 将它们序列化到磁盘以供以后上传。
这就是我为一组图像所做的。在这种情况下,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。
它将看起来像:
page.search("#item_img img").each do |img|
puts page.uri.merge(img[:src]).to_s
end
是的。您可以使用 #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 方法直接下载它们。