2010-04-27 80 views
3

我想處理所有鏈接,但外部的從整個網站。有沒有簡單的方法如何確定鏈接是外部的並跳過它?處理所有鏈接,但外部的(紅寶石+機械化)

我的代碼看起來到目前爲止像(該網站的網址是通過命令行參數傳遞)

我使用機械化(0.9.3)紅寶石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])) 

回答

7

URI有一些方法可以很容易地看出您是在查看本地URL還是在另一個站點上查看本地URL。

這是從URI .route_to()文檔例子稍作修改:

 
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" 

如果有一臺主機發現主機是否您的起始URL的主機相匹配。可以通過子字符串搜索或正則表達式匹配來實現,但如果發生子字符串匹配,那麼這兩種方法都有可能返回誤報。相反,我會使用URI的方法來避免這些誤報;使用route_to()嘗試構建URL的相對路徑。如果結果具有.host值,那麼它是外部的。

+0

非常好的答案。謝謝你。 – Radek 2010-04-27 06:51:46

+0

謝謝。它來自一段時間以來我曾經認爲可能會發揮作用的方法,但卻沒有這樣做。不能保證這將涵蓋所有情況,但使用URI有助於消除許多意想不到的問題。 :-) – 2010-04-27 19:44:35

1

使用鏈接的URI方法:

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

@COdeJoust:它看起來不錯,但在'process_page':未定義的方法'url'爲#(NoMethodError)' – Radek 2010-04-27 03:51:44

+0

ok,it看起來這個方法實際上是.uri,但有時你可以在Web服務器中有相對路徑,然後我得到'nil:NilClass(NoMethodError)'的未定義方法'匹配',因爲沒有主機 – Radek 2010-04-27 04:22:24

相關問題