我是红宝石的初学者。我想要一个 ruby 脚本来获取与该域关联的每个链接,而不使用 gems。(例如)如果我输入网址为http://hsps.in
我的预期输出是:
hsps.in/contacts
hsps.in/projects
hsps.in/blog ..etc
谁能告诉我我怎样才能做到这一点?
我是红宝石的初学者。我想要一个 ruby 脚本来获取与该域关联的每个链接,而不使用 gems。(例如)如果我输入网址为http://hsps.in
我的预期输出是:
hsps.in/contacts
hsps.in/projects
hsps.in/blog ..etc
谁能告诉我我怎样才能做到这一点?
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'] }
正则表达式是你的朋友 :)
在第 570 行,我使用正则表达式扫描链接:
toScan[:links] = toScan[:response].body.scan(/https?:\/\/[^:\s"'<>#\(\)\[\]\{\},;]+/mi)
在第 572 行中,我使用此正则表达式扫描实习生链接:
interneLinks = toScan[:response].body.scan(/href\s*=\s*['"]\/?[^\s:'"<>#\(\)\[\]\{\},;]+/im )
我也不想使用宝石并自己做。所以我使用了正则表达式。使用正则表达式,您可以处理文本模式。它就像一种小语言,您可以使用它来识别字符串中的文本(在您的情况下为 url)。:) 也许有更好的链接正则表达式(谷歌可以找到它们),但我想自己处理它。
希望我能帮你解决这个问题。
在您的控制器操作中
arr = []
routes = %x[rake routes]
routes.split(' ').map{|rt| arr << rt if rt.count('/') > 0 && rt.count('#') == 0}
puts arr.uniq
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 附带的。