2012-10-13 4 views
1

저는 자바 초보자입니다. 내 수업을 위해 우리는 사용자 입력 HTML 소스 코드에서 파싱되어야하는 모든 링크를 출력해야합니다.Java를 사용하여 html의 링크를 구문 분석하는 방법은 무엇입니까?

기본적으로 외부 메서드 (예 : 배열, 하위 문자열 및 문자열 메서드 사용 안 함)를 사용하지 않고 href 특성 뒤에 오는 링크의 문자열을 웹 페이지의 모든 링크에 대해 수행하는 방법을 알고 싶습니다. 다른 라이브러리를 가져올 수는 없습니다).

+0

올바른 방법 : 올바른 HTML 구문 분석기입니다. 당신의 클래스를 위해서 : 나는 단순히 정규식이라고 가정한다. – LanguagesNamedAfterCofee

+0

[이] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) 본 적이 있습니까? 내가 당신을 바로 잡고 싶지는 않다. 단지 위대한 포스트 일 뿐이다 :) – linski

+0

jsoup.More 정보는 http://www.mkyong.com/java/jsoup-html 예제에서 찾을 수있다. -parser-hello-world-examples/ – jafarmlp

답변

5

파서 또는 RegExp를 사용하지 마십시오. 시도하십시오 Jerry. 좋아요 (테스트하지 않음) :

Jerry doc = jerry(html); 
doc.$("a").each(new JerryFunction() { 
    public boolean onNode(Jerry $this, int index) { 
     String href = $this.attr("href"); 
     System.out.println(href); 
    } 
} 

또는 모든 html에 적합한 검색어입니다. 비 외부 요구 사항 때문에 Trying to parse links in an HTML directory listing using Java

+0

고맙겠지 만 문자열의 부분 문자열, 배열 및/또는 메소드를 사용하는 방법이 있습니까? 아마 내 원래의 게시물에 분명히해야합니다. – user1743740

+0

@AntonBessonov, 질문은 자바가 아니라 js입니다. – Chirlo

+1

예, 가능합니다. 그러나 매우 오류가 발생하기 쉽고, 유지하기가 끔찍하며 위에 7 줄을 더 써야합니다. 하위 문자열 등으로 왜 그렇게할까요? http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not 및 http://stackoverflow.com/questions/1732348/regex-match-open-tags-except를 참조하십시오. -xhtml-self-contained-tags/1732454 # 1732454 및 http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html –

2

내가 어떤 클래스에 있는지 알 수 없으므로 정규 표현식 솔루션 이 너에게 너무 앞선 것일 수 있습니다.
예를 들어 첫 해를 보더라도 그럴 수 있지만 실제로는 알 수 없습니다.

부분 문자열이나 배열을 사용하여 할 수 있지만 너무 많은 코딩입니다. 즉, standard Java regular expressions이 존재하는 이유는 다음과 같습니다

String A_TAG_MATCHING_GROUP = "<a>([^<>]*)</a>"; 

Matcher matcher = Pattern.compile(A_TAG_MATCHING_GROUP).matcher("<html>\n<head>d\nadas</head><body><a>LINK_DESC_ONE</a>dsdasd<a>LINK_DESC_2</a></body></html>"); 
String url, linkDescription; 
while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
} 

컴파일하고이 코드를 실행 한 후 계속 읽기!

중요한 부분은 A_TAG_MATCHING_GROUP 정규 표현식입니다. 지금이기 때문에, 그것은 정확한 문자열과 일치합니다 다음에 "<을 >"

  • 없음 또는 당신이 원하는만큼 characther 년대 (스타로 표시로 - *)
  • "<"또는 ">"(무언가 내부 대괄호이고 정확한 용어는 - []이다 - 상술 한 바와 같이 characther이 (^ 캐럿로 나타낸 바와 같이)의 하지가 모든 문자로 정의 문자 클래스)는

    matcher.group(i); 
    

    와 잘 A_TAG_MATCHING_GROUP 정규 표현식을 작성하는 경우

그래서, 당신은 URL을 얻을 것이다. 그것은 당신 클래스를위한 것이기 때문에 나는 당신을 위해 그것을 쓰지 않을 것입니다. matcher 인자를 수정하고 약간 (hardcoded html 문자열을 변경하십시오)을 실행하십시오. 실제 HTML을 가져 와서 실제 공구 출력 (예 : one)과 출력을 비교하십시오.

물론

, 당신은 주어진 자습서를 읽을 수 있어야합니다 여기에 관련 API 링크되기 전에 (this이 유용 할 수 있음) :

그러나, 당신은 "배열과 문자열"을 사용하려는 경우, 다음과 같은 algorithmn을 사용할 수

  1. 문자, 예를 들어 당 HTML 문자를 읽어

    문자열 html; 대한 (문자 C : s.toCharArray()) { //
    }

  2. 는 "<"에 도착하면

  3. 결정 (부울 변수 first_char_of_a_tag_found에 예)를 remeber 당신에게 것 immediatley는 "a"문자가 뒤따라 지길 원하거나 줄 바꿈과 공백을 허용합니다. 부울 변수로 "a"를 기억할 때.

  4. "href =" "에 도달하면 내용을 기억합니다. [substring()] (http://docs.oracle.com/javase/6/docs/api/java/lang/String)을 사용할 수 있습니다. .html 중에서 #의 HTML 문자열에이 문자열 (INT, INT)) 및 StringBuilder 변수라는 URL에 반환 값을 저장합니다.

이 매우 낮은 수준의 알고리즘하지만 일을 할 것입니다. 그것은 코딩이 많이 필요하며 monolithic, procedural 접근 방식입니다.

기본적으로 loosley는 정규 표현식 "엔진"을 구현합니다. 나는이 게시물의 첫 번째 부분에서 설명했다.

과제 (자바에서 취업 인터뷰를위한 첫 번째 인터뷰와 Java 컬리지의 입학 시험으로 두 번째 과제) 모두를 프로그래밍했지만 일반적인 학습 방법 (두 번째 테스트)에도 불구하고 먼저 첫 번째 것을 권 해드립니다. 그러나 그것은 당신이 빡빡한 스케줄에 있고 당신의 현재 지식이 무엇인지에 달려 있습니다.

는 희망이 도움 :)

편집 :

당신 하지 구문 분석 정규식 HTML,하지만 당신은 URL의 그들과 태그에서 구문 분석 할 수 있습니다. 혼란하지 않기 위해, 나는 Anton가 제안했던 것에 따라 Jerry와 definetly 히 간다.

당신은 솔루션) : 단지 우선,이를 처리하는 데 필요한 자신의 크기와 광산 포스트와 시간을 관찰에서 현실에서 waay 더 나은 제리처럼

0

당신은 몇 가지를 고려하는 것이 좋습니다 것을 볼 수 있습니다 이 중 ideas

관련 문제