“google-search”gem的示例代码不起作用?

时间:2013-10-15 13:30:23

标签: ruby search gem

每次我运行此代码(作为“google-search”gem的示例)时,我的所有三个rank_for查询都将返回“未找到”。

考虑问题可能在if item = find_item(/vision\-media\.ca/, query),因为我不确定他们为什么指的是vision-media.ca网站。

请帮忙!我本周刚刚读了一本关于Ruby的书。

require "rubygems"
require "google-search"

def find_item uri, query
    search = Google::Search::Web.new do |search|
        search.query = query
        search.size = :large
        search.each_response { print "." ; $stdout.flush }
    end
        search.find { |item| item.uri =~ uri }
end

def rank_for query
    print "%35s " % query
    if item = find_item(/vision\-media\.ca/, query)
        puts " #%d" % (item.index +1)
    else
        puts " Not found"
    end
end

rank_for "hackerspace new york"
rank_for "makerspace new york"
rank_for "fab lab new york"

1 个答案:

答案 0 :(得分:3)

这个例子不是很明显,因为它使用了“高级”ruby功能。

例如:

search.each_response { print "." ; $stdout.flush }{...}中注册了一个代码块,该代码块在获取谷歌的另一个结果页面时被调用。

search.find { |item| item.uri =~ uri }是一个非常基本的概念,称为迭代器,但可能就是你得到“Not Found”消息的情况。它检查返回的google uri是否与rank_for/vision\-media\.ca/)中提供的正则表达式匹配。你应该明确地阅读正则表达式,如果这是新的。它们也广泛用于红宝石中。 请记住,方法中最后一个评估的东西将是该方法的返回值。因此find_item将返回find计算的值(uri与vision-media.ca匹配的所有项目)。

另一件事是输出格式print "%35s " % query。这将以sprintf中描述的特定格式打印出查询内容。学习它,喜欢它。

这就是解释概念的全部内容。

一个非常简单的实现就是:

require "google-search"

[
  "hackerspace new york",
  "makerspace new york",
  "fab lab new york"
].each do |query|
  puts "searching for #{query}"
  Google::Search::Web.new do |search|
    search.query = query
    search.size = :large
  end.each { |item| puts item.title }
end