Sidewinder


World


FishMusic


LaughingBaby


Thursday, July 31, 2008

java HTML Parsing & ParserCallback


import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.HTML;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.HttpURLConnection;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.parser.ParserDelegator;


public class HTMLParsing {
private static FileWriter writer;
//파서는 콜백 형식으로 되어 있다. 각 태그가 들어 올때 적절한 메소드가 호출됨
private class CallbackHandler extends HTMLEditorKit.ParserCallback {

//태그가 시작할 때 호출 되는 메소드
public void handleStartTag(HTML.Tag tag, MutableAttributeSet a, int pos) {

//<A href 인 경우... A태그를 찾는다...
if (tag == HTML.Tag.A) {
System.out.println(a.getAttribute(javax.swing.text.html.HTML.Attribute.HREF));
}
}

//텍스트가 들어올때 호출되는 메소드
public void handleText(char[] data, int pos) {
System.out.println(data);
try {
//텍스트만 파일에 저장합니다.
writer.write(data);

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}



public void parse(String str) {
String content = null;

try {

//입력받은 URL에 연결하여 InputStream을 통해 읽은 후 파싱 한다.
// URL url = new URL(str);
//
// HttpURLConnection con = (HttpURLConnection)url.openConnection();
//
// InputStreamReader reader = new InputStreamReader(con.getInputStream(),"euc-kr");
// 여기를 수정하시면 되고요.
// 의문점 부담없이 쪽지 주세요.
InputStreamReader reader = new InputStreamReader(new FileInputStream(new File(str)),"euc-kr");

new ParserDelegator().parse(reader, new CallbackHandler(), true);
//
// con.disconnect();
}
catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException {
//저장파일 만들고
writer = new FileWriter("c:/temp/output.txt");

HTMLParsing parser = new HTMLParsing();
parser.parse("c:/temp/aa.txt");
//파일닫는다.
writer.close();
}
}




문]
아래소스가 있습니다.
밑의 소스는
URL주소를 명령행 인자로 넣으시면 그 URL주소의 소스를 긁어와서 필요없는 태그들을 제거하고 필요한 내용만
남기고 저장하는 소스인데요,^^
저는 URL주소를 명령행인자로 줘서 URL소스를 긁어오는것이 아니라,
미리 준비되어 있는 txt파일을 불러와서 파싱하고 싶습니다.
C:\TEMP\aa.txt
탬프폴더 안에 있는 aa.txt파일을 불러와서 파싱하고 싶은데....
Input,output,,..stream의 개념이 제대로 없는건지....책을 읽고 이것저것 시도해봤는데 안되네요-_-;;;
고수님들 제발 도와주세요.................ㅠㅠ
밑의 소스는 일단 파싱은 알아서 해주니 그부분 말고
저장되어 있는 텍스트파일(소스) 불러와서 새로 다시 다른이름으로 저장하고 싶습니다..ㅠㅠ
어떻게 하면되나요??
꼭 좀 도와주십쇼...
부탁드립니다.


No comments:

Post a Comment