이걸 하면서 정말 답이 없다는걸 느낍니다.
그것은 HTML은 정말 답이 없다는걸요.
얼마나 Well-Format 한 Documet 가 중요하다는것을...
그것은 HTML은 정말 답이 없다는걸요.
얼마나 Well-Format 한 Documet 가 중요하다는것을...
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTML.Tag;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.html.parser.ParserDelegator;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.HttpURLConnection;
import java.util.Enumeration;
public class Example
{
// 파서는 콜백 형식으로 되어 있다. 각 태그가 들어 올때 적절한 메소드가 호출됨
private class CallbackHandler extends HTMLEditorKit.ParserCallback
{
private String urlReg = "\\.\\./bbs/board\\.php\\?bo_table=cs_notice&wr_id=([0-9]){2,4}";
private String dataReg = "([?0-9]){2}-([?0-9]){2}";
private String noticeReg = "(.*[0-9ㄱ-ㅎㅏ-ㅣ가-힣]+.*[^공지사항]){5,}";
@Override
public void flush( ) throws BadLocationException {
System.out.println( "flush" );
}
@Override
public void handleComment( char[] data, int pos ) {
System.out.println( "Cmt " + new String( data ) );
}
@Override
public void handleEndOfLineString( String eol ) {
System.out.println( "EOL " );
}
@Override
public void handleEndTag( Tag t, int pos ) {
System.out.println( "End " );
}
@Override
public void handleError( String errorMsg, int pos ) {
// System.out.println("ERROR\t" + new String(errorMsg));
}
@Override
public void handleSimpleTag( Tag t, MutableAttributeSet a, int pos ) {
/*System.out.print( "Sim <" + t.toString( ) + ">\n" );
for ( Enumeration e = a.getAttributeNames( ); e.hasMoreElements( ); ) {
Object attributeName = e.nextElement( );
System.out.print( "\t" + attributeName + "=" );
System.out.println( a.getAttribute( attributeName ) );
}
*/
}
@Override
public void handleStartTag( Tag t, MutableAttributeSet a, int pos ) {
if ( t == HTML.Tag.A ) {
Object str = a.getAttribute( HTML.Attribute.HREF );
if ( str != null ) { // 문제는 태그가 검출된다 하더라도 속성이 없을수도 있기 때문에 null체크를 해줘야 합니다.
if ( str.toString( ).matches( this.urlReg ) ) {
System.out.println( "HREF : " + str );
}
}
}
}
public void handleText( char[] data, int pos ) {
String str = new String( data );
if ( str.matches( this.dataReg ) ) {
System.out.println( "Data : " + str );
}
else if ( str.matches( this.noticeReg ) ) {
System.out.println( "Notice :" + str );
}
}
}
public void parse( String str ) {
try {
// 입력받은 URL에 연결하여 InputStream을 통해 읽은 후 파싱 한다.
URL url = new URL( str );
HttpURLConnection con = (HttpURLConnection) url.openConnection( );
InputStreamReader reader = new InputStreamReader(
con.getInputStream( ), "utf-8" );
// callbackHandler 와 함께 reader 을 딜리게이터에 던집니다.
new ParserDelegator( ).parse( reader, new CallbackHandler( ), true );
con.disconnect( );
}
catch ( Exception e ) {
e.printStackTrace( );
}
}
public static void main( String[] args ) {
Example parser = new Example( );
parser.parse( URString );
}
기본적인 parser 뼈대 코드 참고 : http://zyint.tistory.com/352
기본적인 자바 정규식 : http://litlhope.springnote.com/pages/1786498
자바 한글 정규식 참고 : http://ohgyun.tistory.com/132
기본적인 자바 정규식 : http://litlhope.springnote.com/pages/1786498
자바 한글 정규식 참고 : http://ohgyun.tistory.com/132
Posted by LaLuna




