2013-10-23 49 views
2

我使用Anemone来蜘蛛域,它工作正常。海葵红宝石蜘蛛 - 创建不带域名的键值数组

的代码来启动爬行看起来是这样的:

require 'anemone' 

Anemone.crawl("http://www.example.com/") do |anemone| 
    anemone.on_every_page do |page| 
     puts page.url 
    end 
end 

这非常漂亮打印出所有的网页网址,像这样的域名:

http://www.example.com/ 
http://www.example.com/about 
http://www.example.com/articles 
http://www.example.com/articles/article_01 
http://www.example.com/contact 

我想这样做是使用键的url的最后一部分创建一个键值对的数组,并使用url的“减去域”作为值。

E.g.

[ 
    ['','/'], 
    ['about','/about'], 
    ['articles','/articles'], 
    ['article_01','/articles/article_01'] 
] 

道歉,如果这是基本的东西,但我是一个Ruby新手。

+0

你所描述的所需输出不包含任何键值对(即散列)。这都是数组。 – Agis

+0

如前所述,我是Ruby新手,所以我的标记插图和术语可能不正确。但是,如果你有什么更具建设性的提供那可爱。 –

+0

理解“哈希”(键值对)和“数组”(有序对象列表)之间的区别非常重要,因此您不妨称此评论为“有建设性”。 – Agis

回答

0

最简单和最可能的稳健的方式来做到这一点是使用

page.url.split('/').last 

获得你的“关键”。您需要测试各种边缘情况以确保其可靠工作。

编辑:这将返回“www.example.com”为键“http://www.example.com/”这是不是你需要

2

我会先定义一个数组或哈希的代码块外,然后将结果添加键值对到它:

require 'anemone' 

path_array = [] 
crawl_url = "http://www.example.com/"  

Anemone.crawl(crawl_url) do |anemone| 
    anemone.on_every_page do |page| 
    path_array << page.url 
    puts page.url 
    end 
end 

从这里,你可以.MAP你的阵列成可用的多维数组:

path_array.map{|x| [x[crawl_url.length..10000], x.gsub("http://www.example.com","")]} 

=> [["", "/"], ["about", "/about"], ["articles", "/articles"], ["articles/article_01", "/articles/article_01"], ["contact", "/contact"]] 

我不是苏如果它能在任何情况下都能正常工作,但我认为这可以为您如何收集数据并对其进行操作提供良好的开始。另外,如果您想要一个键/值对,您应该查看Ruby的类Hash以获取有关如何在Ruby中使用和创建哈希的更多信息。

+0

我给了这个镜头,发现银莲花可能使用哈希,因为我得到一个错误'未定义的方法'gsub'为#' –

+0

它可能是这样的情况,.gsub不能在URI对象上工作(也许这就是在path_array中返回的内容。我想知道是否可以用一个方法将该对象转换为一个url字符串,然后你可以执行gsub –

+0

所以我测试了一下我自己,并说它返回URI对象。我认为在这种情况下,您可以简单地执行path_array.map {| x | [x.host,x.path]} –