我想从整个网站处理所有链接,但外部链接。有没有简单的方法如何识别链接是外部的并跳过它?
我的代码到目前为止(网站网址是通过命令行参数传递)
我正在使用 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]))
答案 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