我想处理整个网站的所有链接,但外部链接.有没有简单的方法如何识别链接是外部的并跳过它?
我的代码看起来像(网站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)
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值,那么它是外部的.
| 归档时间: |
|
| 查看次数: |
1627 次 |
| 最近记录: |