如何使用nokogiri / hpricot和其他gem在网页上grep文件名和扩展名?

时间:2012-01-06 06:30:48

标签: ruby-on-rails nokogiri web-crawler hpricot

我正在开发一个我需要的应用程序

1)获取网站的所有链接

2)然后获取每个文件和文件扩展名的列表 的网页/链接。

我完成了它的第一部分:) 我通过以下代码获得网站的所有链接..

require 'rubygems'
require 'spidr'
require 'uri'


Spidr.site('http://testasp.vulnweb.com/') do |spider|
  spider.every_url { |url| 
                     puts url    
                   }
end

现在我必须在每个中获取所有文件/文件扩展名 页面,所以我尝试了下面的代码

require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'spidr'

site = 'http://testasp.vulnweb.com'

in1=[]

Spidr.site(site) do |spider|

    spider.every_url { |url| in1.push url }

end


in1.each  do |input1|

  input1 = input1.to_s
  #puts input1
  begin
    doc = Nokogiri::HTML(open(input1))
    doc.traverse do |el|
        [el[:src], el[:href]].grep(/\.(txt|css|gif|jpg|png|pdf)$/i).map{|l| URI.join(input1, l).to_s}.each do |link| 
            puts link  
        end
    end
  rescue => e
       puts "errrooooooooor"
  end

end

但任何人都可以指导我如何解析链接/网页并获取文件 - 页面中的扩展名?

1 个答案:

答案 0 :(得分:1)

您可能需要查看URI#parse。 URI模块是Ruby标准库的一部分,是spidr gem的依赖项。使用规范进行良好测量的示例实现。

require 'rspec'
require 'uri'

class ExtensionExtractor  
  def extract(uri)
    /\A.*\/(?<file>.*\.(?<extension>txt|css|gif|jpg|png|pdf))\z/i =~ URI.parse(uri).path
    {:path => uri, :file => file, :extension => extension}
  end
end

describe ExtensionExtractor do
  before(:all) do
    @css_uri = "http://testasp.vulnweb.com/styles.css"
    @gif_uri = "http://testasp.vulnweb.com/Images/logo.gif"
    @gif_uri_with_param = "http://testasp.vulnweb.com/Images/logo.gif?size=350x350"
  end

  describe "Common Extensions" do
    it "should extract CSS files from URIs" do
      file = subject.extract(@css_uri)
      file[:path].should eq @css_uri
      file[:file].should eq "styles.css"
      file[:extension].should eq "css"
    end

    it "should extract GIF files from URIs" do
      file = subject.extract(@gif_uri)
      file[:path].should eq @gif_uri
      file[:file].should eq "logo.gif"
      file[:extension].should eq "gif"
    end

    it "should properly extract extensions even when URIs have parameters" do
      file = subject.extract(@gif_uri_with_param)
      file[:path].should eq @gif_uri_with_param
      file[:file].should eq "logo.gif"
      file[:extension].should eq "gif"
    end
  end
end