在抓取图像路径后构造URL

时间:2011-05-05 19:40:04

标签: ruby-on-rails ruby parsing url

我正在尝试抓取用户输入的网址,然后使用HTML中的绝对路径输出有效的非破坏图像元素数组。我正在使用Nokogiri进行抓取,我想知道是否有任何我可以用来轻松处理用户提供的不可预测的URL以及图像路径,而不是弄清楚如何从头开始编写内容。

示例:

http://domain.com/ and /system/images/image.png
=> http://domain.com/system/images/image.png

http://sub.domain.com and images/common/image.png
=> http://sub.domain.com/images/common/image.png

http://domain.com/dir/ and images/image.png
=> http://domain.com/dir/images/image.png

http://domain.com/dir and /images/small/image.png
=> http://domain.com/images/small/image.png

http://domain.com and http://s3.amazon-aws.com/bucket/image.png
=> http://s3.amazon-aws.com/bucket/image.png 

2 个答案:

答案 0 :(得分:2)

我建议使用Mechanize,而不是下载页面并使用Nokogiri。它建立在Nokogiri之上,因此您可以使用Mechanize完成Nokogiri的所有操作,但它为刮擦/导航添加了许多有用的功能。它将处理您在上面描述的相对URL问题。

require 'rubygems'
require 'mechanize'
url='http://stackoverflow.com/questions/5903218/construct-urls-after-scraping-for-image-paths/5903417'
Mechanize.new.get(url) {|page| puts page.image_urls.join "\n"}

答案 1 :(得分:1)

如果你真的想自己做(而不是使用Mechanize,请说),请使用URI::join

require 'uri'
URI::join("http://domain.com/dir", "/images/small/image.png")
  # => http://domain.com/images/small/image.png

请注意,如果有的话,您必须尊重HTML页面的BASE标记...