处理所有链接但外部链接(ruby + mechanize)

时间:2010-04-27 03:36:10

标签: ruby mechanize

我想从整个网站处理所有链接,但外部链接。有没有简单的方法如何识别链接是外部的并跳过它?

我的代码到目前为止(网站网址是通过命令行参数传递)

我正在使用 mechanize(0.9.3) ruby​​ 1.8.6 (2008-08-11 patchlevel 287)[i386-mswin32]

请注意,网站可以使用相对路径,因此没有主机/域,这使得它更复杂

require 'mechanize'

def process_page(page) 
  puts
  puts page.title
  STDIN.gets
  page.links.each do |link|
process_page($agent.get(link.href))
  end
end

$agent = WWW::Mechanize.new 
$agent.user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4'
process_page($agent.get(ARGV[0]))

2 个答案:

答案 0 :(得分:7)

URI有一些方法可以让您轻松查看本地URL或其他网站上的URL。

这是对URI .route_to()docs示例的一个小修改:

require 'uri'

URI.parse('/main.rbx?page=1').host # => nil
URI.parse('main.rbx?page=1').host  # => nil

内部网址没有主机,所以我会解析有问题的网址,看看他们是否有主机。如果没有,它就是网站的内部。

指向外部网站的网址将返回主机的值,但相关网站的完整网址也是如此,因此您必须进行更多的按摩。

uri = URI.parse('http://my.example.com')

uri.route_to('http://my.example.com/main.rbx?page=1').host  # => nil
uri.route_to('http://another.com/main.rbx?page=1').host # => "another.com"

如果有主持人,请查看该主机是否与起始网址的主机匹配。您可以通过子字符串搜索或正则表达式匹配来实现,但如果发生子字符串匹配,这两者都有可能返回误报。

相反,我会使用URI的方法来避免这些误报;使用route_to()尝试构建URL的相对路径。如果结果具有.host值,则它是外部的。

答案 1 :(得分:1)

使用链接的uri方法:

  page.links.each do |link|
     next unless link.uri.host.match(/(www\.)?thissite\.com/)
     process_page($agent.get(link.href))
  end