2011-09-16 5 views
1

많은 양의 텍스트에서 HTML을 제거해야합니다. 다른 Reader를 감싸는 java.io.Reader를 구현하는 클래스를 찾고 HTML 태그를 모두 생략하도록 텍스트를 변환하거나 공백으로 대체 할 수 있다면 멋질 것입니다. 잘못 구성된 HTML을 처리 할 수 ​​있어야합니다.HTML 태그를 스킵 할 수있는 java.io.Reader 클래스인가?

성능이 중요합니다. 최대한 많은 기가 바이트의 텍스트를 처리해야합니다. 이 작업을 수행하는 일반적인 방법은 내 HTML을 String으로 읽어 들여 DOM 트리로 구문 분석하고 내가가는대로 텍스트를 추출하는 노드를 반복하는 것입니다. 불행히도 그것은 너무 느립니다. 구현은 일종의 저수준 렉서 (lexer)에 기반해야한다고 생각합니다.

누구든지이 작업을 수행 할 수있는 라이브러리에 대해 알고 있습니까?

+0

나는 XSLT를 제안 하겠지만, 당신은 HTML의 일부가 잘못 형성되었다고 말했어. – emory

+1

먼저 JTidy를 실행하여 XSLT를 적용 해 볼 수 있습니다. XSLT가 정확히 타오르는 것은 아닙니다. 간단한 찾기 및 바꾸기를 고려할 수 있습니다. – Josh

+0

어쩌면 당신은 [정규식?] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) – erickson

답변

1

나는 모든 텍스트를 원한다고 가정하기 때문에 대부분의 것들을 얻는 hackish regex는 적합하지 않습니다. 즉, 최소한 구문 분석의 첫 번째 부분을 완료해야하지만 라이브러리는 가능한 한 작게 수행해야합니다.

tagsoup을 사용하면 낮은 수준의 색소폰 인터페이스를 사용할 수 있습니다. 태그를 무시하고 텍스트 노드 값만 수집하면됩니다. 합리적으로 가능한 한 쉽고 빠릅니다.

+0

태그를 멋지게 사용할 수 있습니다. 한 가지 단점은 JDK의 기본 XML 코드로는 작동하지 않으며 Saxon을 사용해야한다는 것입니다. 그러나 그렇지 않으면 좋아 보인다. – ccleve

1

저는 과거에 JTidy을 성공적으로 사용했습니다.

본질적으로 실제 HTML을위한 DOM 파서이기 때문에 필요한 것 이상을 수행합니다. 좋은 점은 그것이 견고하다는 것입니다; 브라우저에서와 같이 마크 업에서 단점을 처리 할 수 ​​있습니다.

0

속도면에서 스트리밍 파서가 필요할 것입니다. 어쩌면 Validator.nu일까요?

0

아마도 ParserCallback은 DOM을 만드는 것보다 빠릅니다. 다른 포스터가 말했듯이

import java.io.*; 
import java.net.*; 
import javax.swing.text.*; 
import javax.swing.text.html.parser.*; 
import javax.swing.text.html.*; 

public class ParserCallbackText extends HTMLEditorKit.ParserCallback 
{ 
    public void handleText(char[] data, int pos) 
    { 
     System.out.println(data); 
    } 

    public static void main(String[] args) 
     throws Exception 
    { 
     Reader reader = getReader(args[0]); 
     ParserCallbackText parser = new ParserCallbackText(); 
     new ParserDelegator().parse(reader, parser, true); 
    } 

    static Reader getReader(String uri) 
     throws IOException 
    { 
     // Retrieve from Internet. 
     if (uri.startsWith("http:")) 
     { 
      URLConnection conn = new URL(uri).openConnection(); 
      return new InputStreamReader(conn.getInputStream()); 
     } 
     // Retrieve from file. 
     else 
     { 
      return new FileReader(uri); 
     } 
    } 
} 
0

일반적인 방법은 실제로 파일에서 직접 HTML을 구문 분석하는 것, 어떤 중간 시간과 공간 낭비 문자열하지만, ​​먼저 HTML을 정돈 할 필요가 없을 것입니다, JTidy, NekoHMTL 등. 거기에서 아마도 XSLT를 사용할 것이지만 극단적 인 성능이 필요할 경우에는 아마 사용하지 않을 것입니다. 여전히 파서를 선택할 수 있습니다. SAX 또는 StAX 파서는 DOM 파서보다 빠르고 공간 효율적입니다.

관련 문제