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

Rad*_*dek 3 ruby mechanize

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

我的代码看起来像(网站url通过命令行参数传递)

我正在使用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]))
Run Code Online (Sandbox Code Playgroud)

the*_*Man 7

URI有一些方法可以让您很容易地看到您是在查看本地URL还是在另一个站点上查看.

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

require 'uri'

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

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

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

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"

如果有主机,请查看该主机是否与起始URL的主机匹配.你可以做到这一点的一个字符串搜索或正则表达式匹配,但两者那些有发生字符串匹配返回误报的可能性.

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