2008-10-26 10 views
50

웹 사이트에서 데이터를 가져 오는 응용 프로그램을 만들고 있는데 데이터를 가져 오는 방법에 대해 궁금합니다. '내가 할 수있는이 작동하지만 - 난 그냥 HTML의 각 라인에서Java HTML 구문 분석

div class = "classname" 

확인하고있어 현재 (테스트 용) - 특히 나는 특정 CSS 클래스를 사용 DIV 태그의 수에 포함 된 데이터가 필요 도움이되지만 더 나은 해결책이 있다는 것을 느낄 수 있습니다.

인가가 나는 클래스를 HTML의 라인을 제공하고 같은 몇 가지 좋은 방법이있을 수있는 좋은 방법 : 당신의 HTML이 잘 형성되면

boolean usesClass(String CSSClassname); 
String getText(); 
String getLink(); 
+1

관련 항목 : [주요 Java HTML 파서의 장단점은 무엇입니까?] (http://stackoverflow.com/questions/3152138/what-are-the-pros-and-cons-of-the-leading -java-html-parsers) – BalusC

답변

18

몇 년 전 나는 같은 목적을 위해 JTidy를 사용 :.

http://jtidy.sourceforge.net/

는 "JTidy는 HTML 단정하는 HTML 문법 검사기 꽤 프린터의 자바 포트는 비 Java처럼 사촌 인 JTidy는 조작 된 HTML을 정리하는 도구로 사용할 수 있으며 처리중인 문서에 DOM 인터페이스를 제공하므로 JTidy를 실제 HTML에 대한 DOM 파서로 효과적으로 사용할 수 있습니다 .

JTidy는 앤디 퀵 (Andy Quick)에 의해 쓰여졌습니다. 앤디 퀵 (Andy Quick)은 나중에 관리자의 위치에서 물러났습니다. 이제 JTidy는 자원 봉사자 그룹에 의해 유지 관리됩니다. ...

JTidy에

자세한 정보는 JTidy 소스 포지 프로젝트 페이지에서 찾을 수 있습니다 "

+2

슬프게도 천천히 느릴 수 있습니다. – PlexQ

+0

JTidy는 버려진 프로젝트처럼 보이지만 몇 년 동안 업데이트되지 않았습니다. – rlegendi

0

, 당신은 쉽게 할 XML 파서를 고용 할 수 있습니다 당신을위한 직업 ... 당신이 독서하는 경우에, SAX는 이상적 일 것입니다.

+2

HTML이 올바른 형식 인 경우. 그게 언제입니까? – PlexQ

+2

왜 그럴까? – Yuval

+0

저는 다른 사람들과 프로젝트를 진행하기 때문에 그 중 일부는 완벽한 HTML을 만들지 못하는 디자이너이고 다른 많은 사람들도 유혹을 피하기 위해 이중으로 사용하지 않습니다. – PlexQ

13

조작 된 HTML을 처리 할 수있는 Java HTML 파서 인 TagSoup에 관심을 가질 수 있습니다. XML 파서는 올바른 형식의 XHTML에서만 작동합니다.

5

HTMLParser 프로젝트 (http://htmlparser.sourceforge.net/)가있을 수 있습니다. 조작 된 HTML을 처리하는 데 꽤 괜찮은 것 같습니다. 다음 코드는 당신이 필요로하는 무엇을 수행해야합니다

Parser parser = new Parser(htmlInput); 
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName"); 
NodeList nodes = parser.parse(cssFilter); 
20

감동적인 선행에 의해 명시된 바와 같이 주요 문제는 잘못된 HTML, 그래서 html로 청소기 또는 HTML-XML 컨버터가 필수입니다. 일단 XML 코드 (XHTML)를 받으면이를 처리 할 수있는 많은 도구가 있습니다. 필요한 데이터 만 추출하는 간단한 SAX 핸들러 또는 원래 코드를 수정할 수있는 트리 기반 메소드 (DOM, JDOM 등)를 사용하여 얻을 수 있습니다.

다음은 HTML cleaner을 사용하여 특정 클래스를 사용하는 모든 DIV를 가져 와서 그 안에있는 모든 텍스트 콘텐츠를 인쇄하는 샘플 코드입니다.

import java.io.IOException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import org.htmlcleaner.HtmlCleaner; 
import org.htmlcleaner.TagNode; 

/** 
* @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom> 
*/ 
public class TestHtmlParse 
{ 
    static final String className = "tags"; 
    static final String url = "http://www.stackoverflow.com"; 

    TagNode rootNode; 

    public TestHtmlParse(URL htmlPage) throws IOException 
    { 
     HtmlCleaner cleaner = new HtmlCleaner(); 
     rootNode = cleaner.clean(htmlPage); 
    } 

    List getDivsByClass(String CSSClassname) 
    { 
     List divList = new ArrayList(); 

     TagNode divElements[] = rootNode.getElementsByName("div", true); 
     for (int i = 0; divElements != null && i < divElements.length; i++) 
     { 
      String classType = divElements[i].getAttributeByName("class"); 
      if (classType != null && classType.equals(CSSClassname)) 
      { 
       divList.add(divElements[i]); 
      } 
     } 

     return divList; 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      TestHtmlParse thp = new TestHtmlParse(new URL(url)); 

      List divs = thp.getDivsByClass(className); 
      System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***"); 
      for (Iterator iterator = divs.iterator(); iterator.hasNext();) 
      { 
       TagNode divElement = (TagNode) iterator.next(); 
       System.out.println("Text child nodes of DIV: " + divElement.getText().toString()); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
58

HTML 처리에 유용 할 수있는 또 다른 라이브러리는 jsoup입니다. Jsoup는 잘못된 형식의 HTML을 지우려고하며 태그 선택기 구문과 같은 jQuery를 사용하여 Java에서 html 구문 분석을 허용합니다.

http://jsoup.org/

+0

Jsoup가 가장 좋습니다 –

+0

외부 항아리가없는 방법이 있습니까? – Futuregeek

+1

@Futuregeek [이 답변] (https://stackoverflow.com/a/1732454/5484609)을 읽을 때까지 정규식을 사용했습니다. –

3

nu.validator 프로젝트는 정확성이 많다는 모서리를 잘라하지 않는 뛰어난 고성능 HTML 파서입니다.

Validator.nu HTML 파서는 Java에서 HTML5 파싱 알고리즘을 구현 한 것입니다. 파서는 이미 XML 파서로 XHTML 1.x 콘텐츠를 지원하고 파서와 인터페이스하기 위해 SAX, DOM 또는 XOM을 사용하는 응용 프로그램에서 XML 파서의 드롭 인 대체품으로 작동하도록 설계되었습니다. 저수준 기능은 자신의 IO를 수행하고 스크립트를 사용하여 document.write()를 지원하려는 응용 프로그램에 제공됩니다. 파서 코어는 Google Web Toolkit에서 컴파일되며 자동으로 C++로 변환 될 수 있습니다. (는 C++ 번역 기능은 현재 게코에 사용하기 위해 파서를 포팅하는 데 사용됩니다.) 또한 XWiki HTML Cleaner을 사용할 수 있습니다

1

:

그것은 HTMLCleaner를 사용하고 유효한 XHTML 1.1 콘텐츠를 생성하는 데 확장합니다.

4

Jerry의 java에서 jQuery를 잊지 말자. HTML 문서 파싱, 트래버스 및 조작을 단순화하는 빠르고 간결한 Java 라이브러리. css3 선택자의 사용을 포함합니다.

예 :

Jerry doc = jerry(html); 
doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy"); 

예 :

doc.form("#myform", new JerryFormHandler() { 
    public void onForm(Jerry form, Map<String, String[]> parameters) { 
     // process form and parameters 
    } 
}); 

는 물론, 이러한 모든 것이 보이는 방법 느낌을 얻을 수있는 단지 몇 가지 빠른 예입니다.

+0

이 링크가 질문에 대답 할 수 있지만, 여기에 답변하고 참조 용 링크를 제공하십시오. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. – Brian

+1

Thanx, 추가 예제. 나는 다른 코멘트의 대부분에 대해 예제를 보지 못했기 때문에 같은 패턴을 따랐다. – igr

+0

문제 없습니다. Low Quality Queue에 나타났습니다. 내 의견은 SO에 의해 자동화됩니다. – Brian