2014-09-15 1 views
0

특정 URL을 구문 분석하고 allInnerLinks ArrayList의 모든 내부 링크 (동일한 도메인) 및 allExternalLinks ArrayList의 모든 외부 URL을 저장하려고합니다.Jsoup를 사용하여 URL 구문 분석하기 중복 URL이 있습니다.

public void go() { 
    Document doc; 
    baseUrl = CountLinks.result3; 
    try { 

     // need http protocol 

     doc = Jsoup 
       .connect(url) 
       .userAgent(
         "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0") 
       .referrer("http://www.google.com").timeout(1000 * 5) 
       .ignoreContentType(true).get(); 
     // get page title 
     String title = doc.title(); 

     // get all links 
     Elements links = doc.select("a[href]"); 

     for (Element link : links) { 
      // !!! 
      // String absUrl = link.absUrl("href"); 
      String absUrl = link.attr("abs:href"); 


      // get the value from href attribute 
      if (absUrl.contains(baseUrl) 
        && !(absUrl.contains("mailto"))) { 
       allInnerLinks.add(absUrl); 
       allInnerLinksCounter++; 
      } else { 
       allExternalLinks.add(absUrl); 
       allExternalLinksCounter++; 
      } 

     } 

    } catch (NullPointerException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (HttpStatusException e) { 
     e.printStackTrace(); 
     System.out.println(e.getUrl()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

하지만 마지막에는 중복 요소가 있습니다. 동일한 URL이지만 번호 기호 #가 링크의 끝에 나타납니다. 나는 그것을 얻는 방법을 이해할 수 없다 :

PAGEURL              EXTERNAL URLS  
---------------------------------------------------------------------------------------- 
http://hostingmaks.com/category/news/      https://meetings.webex.com/ 
http://hostingmaks.com/category/news/#      https://meetings.webex.com/ 

왜 그럴까요?

+0

'#'은 하위 섹션과 같이 페이지의 특정 북마크를 나타냅니다. 일부 사이트에서는 텍스트를 사용하여 페이지를 계속 제어 할 수 있습니다 (예 : example.com/#!/somePage'). – Pokechu22

+0

@ Pokechu22 실제로 줄 문자열을 변경하면 absUrl = link.attr ("abs : href"); to 문자열 absUrl = link.attr ("href"); 다음은 # 괜찮습니다. 그러나이 경우 프로그램은 외부 링크로 "/docs/example1.doc"를 참으로 계산합니다. 그래서 "abs : href"(절대 URL)을 사용하지만 대신 중복 된 URL을 사용합니다. – zkvarz

답변

0

부울을 반환하는 후행 해시/파운드 기호/숫자 기호가 있는지 확인하기 위해 아래 간단한 방법을 작성했습니다.

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public boolean hasHashTag(String url) { 
    int index = url.lastIndexOf("#"); 
    if(index == -1) { 
     return false; 
    } else { 
     Pattern p = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE); 
     Matcher m = p.matcher(url.substring(index+1)); 
     System.out.println(url.substring(index+1) + " "+ (index + 1)); 
     return !m.find(); 
    } 
} 

이제이 방법을 사용하여 중복 된 항목을 필터링 할 수 있습니다.

if(hasHashTag(URLHERE)) { 
    //don't add to urls to search 
} else { 
    //add url to search 
} 
관련 문제