0

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

我的预期输出是:

      hsps.in/contacts
      hsps.in/projects
      hsps.in/blog ..etc

谁能告诉我我怎样才能做到这一点?

4

4 回答 4

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'] }
于 2013-09-13T07:26:04.643 回答
1

正则表达式是你的朋友 :)

也许这个要点会帮助你我刚才创建的。

在第 570 行,我使用正则表达式扫描链接:

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

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

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

我也不想使用宝石并自己做。所以我使用了正则表达式。使用正则表达式,您可以处理文本模式。它就像一种小语言,您可以使用它来识别字符串中的文本(在您的情况下为 url)。:) 也许有更好的链接正则表达式(谷歌可以找到它们),但我想自己处理它。

希望我能帮你解决这个问题。

于 2013-09-13T07:35:36.763 回答
0

在您的控制器操作中

arr = []
routes =  %x[rake routes]
routes.split(' ').map{|rt| arr << rt if rt.count('/') > 0 && rt.count('#') == 0}
puts arr.uniq
于 2013-09-13T07:40:47.400 回答
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值。但它应该证明它确实可以在没有 gem 的情况下完成,只有 Ruby 附带的。

于 2013-09-13T07:58:24.890 回答