2010-04-27 4 views
3

전체 웹 사이트에서 외부 링크 인 을 처리하고 싶습니다. 링크가 외부인지 확인하고 건너 뛸 수있는 쉬운 방법이 있습니까?외부의 모든 링크를 처리합니다 (루비 + 기계화)

내 코드는 지금까지

내가 (0.9.3)루비 1.8.6 (2008-08-11 패치 레벨 기계화를 사용하고 (사이트 URL이 명령 행 인수 통과)처럼 보이는

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을보고 있는지 또는 다른 사이트를보고 있는지 쉽게 알 수있는 몇 가지 방법이 있습니다.

이것은 URI의 .route_to() 문서의 예에서 약간의 수정은 다음과 같습니다

 
require 'uri' 

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

내부 URL이 더 호스트 그래서 문제의 URL을 분석하고 그들이 호스트가 있는지보고 싶은데이 없습니다. 그렇지 않은 경우 사이트 내부에 있습니다.

외부 사이트를 가리키는 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의 호스트와 일치하는지 확인하십시오. 하위 문자열 검색 또는 정규식 일치를 사용하여 수행 할 수 있지만 둘 다 하위 문자열 일치가 발생할 경우 가양 성을 반환 할 가능성이 있습니다.

그 대신 오탐 (false positive)을 피하기 위해 URI의 방법을 사용합니다. route_to()를 사용하여 URL에 대한 상대 경로를 작성하십시오. 결과에 .host 값이 있으면 외부 값입니다.

+0

아주 좋은 대답입니다. 고마워요. – Radek

+0

감사합니다. 그것은 내가 생각한 * 방식으로 일하는 무리를 벽에 붙잡아 두지 만 오히려 나빠지는 데서 오는 것입니다. 모든 상황을 다룰 수 있다고 보장 할 수는 없지만 URI를 사용하면 예기치 않은 문제가 많이 발생하지 않습니다. :-) –

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'에서 잘 보이지만 # "Statement.html "> (NoMethodError) '에 대한 정의되지 않은 메소드'url' – Radek

+0

메서드가 실제로 .uri 인 것처럼 보이지만 때로는 웹 서버 내에서 상대 경로를 가질 수 있으며 호스트가 없으므로'undefined method '가'nil : NullClass (NoMethodError)'와 일치합니다. – Radek

관련 문제