在不使用内置库的情况下获取ruby中网页的所有链接

时间:2013-09-13 06:54:56

标签: ruby-on-rails ruby http url

我是红宝石的初学者。我想要一个ruby脚本来获取与该域相关联的每个链接而不使用gem。 (e.x)      如果我输入网址为http://hsps.in

我的预期输出是:

      hsps.in/contacts
      hsps.in/projects
      hsps.in/blog ..etc
谁能告诉我怎样才能实现这个目标?

4 个答案:

答案 0 :(得分:1)

open-uri是标准库的一部分,你需要安装nokogiri gem,它会让事情变得更容易

    require 'open-uri'
    require 'nokogiri'

    url = 'http://hsps.in'
    doc = Nokogiri::HTML(open(url))
    links = doc.css('a')
    links.each { |link| puts link['href'] }

答案 1 :(得分:1)

  

RegExp是你的朋友:)

Maybe this gist would help you i created a while ago.

在第570行,我使用Regexp扫描链接:

toScan[:links] = toScan[:response].body.scan(/https?:\/\/[^:\s"'<>#\(\)\[\]\{\},;]+/mi)

在第572行,我使用此正则表达式扫描实习链接:

 interneLinks = toScan[:response].body.scan(/href\s*=\s*['"]\/?[^\s:'"<>#\(\)\[\]\{\},;]+/im )

我也不想使用宝石而是自己做。所以我使用了RegExp。使用Regexpressions,您可以处理Textpatterns。它就像一个小语言,你可以用它来识别字符串中的文本(在你的情况下是网址)。 :)也许有一个更好的regexp链接(谷歌可以找到它们),但我想自己处理它。

我可以帮助你解决这个问题。

答案 2 :(得分:0)

在您的控制器操作中

arr = []
routes =  %x[rake routes]
routes.split(' ').map{|rt| arr << rt if rt.count('/') > 0 && rt.count('#') == 0}
puts arr.uniq

答案 3 :(得分:0)

require 'open-uri'

class PageLinks
  attr_reader :page
  include OpenURI

  def initialize(url)
    @page = open(url).readlines
  end

  def links
    @page.grep(/href/)
  end
end
url = 'http://www.hsps.in'
doc = PageLinks.new url

puts doc.links.inspect

正如你所说'不使用任何宝石',我会接受它包含Rails,即使它被标记为。

这不是一个“干净”的答案,因为它不会提取a代码href值的值。但它应该证明它确实可以在没有宝石的情况下完成,只有Ruby附带的宝石。