오늘은 어디로 갈까...

HtmlCleaner 본문

낙서

HtmlCleaner

剛宇 2009. 3. 30. 17:08
HTML의 장점이자 단점은 바로 융통성이다. 융통성 있는 구조를 가지다 보니, 대충(?) 만들어도 브라우저같은곳에서 잘 보여준다.
그런데... 문제는...
프로그래밍해서 html을 분석하기에는 참 난해한것이다.
규격에 안맞다보니, 섬세하게(?) 제어할려고 하면 꽥~~하는 습성이 있는것이다.
뭐 일일이 수작업(?)으로 분석할 수는 있지만, 그건 너무 잔혹하지 않는가.
이런 고민을 한방에 해결해 줄 라이브러리가 있으니,
그건 바로 Html Cleaner!!! (http://htmlcleaner.sourceforge.net/)
이름 그대로 깔끔한 성격이라서, 매우 마음에 든다.
대상 html을 마음껏 요리할 수 있는 자체 API도 제공하고, xml로 변환하여 처리할 수도 있다.


1. 사용하기.
 - 아래처럼, HtmlCleaner 인스턴스를 생성하여 clean(대상) 메소드를 실행하면 된다.
HtmlCleaner cleaner = new HtmlCleaner();
TagNode node = cleaner.clean(...);

 - 반환되는 TagNode는 일반적인 DOM 방식의 Node 처럼 사용이 기능하다. (getElements...)
 - Object[] evaluateXPath(String) 메소드를 이용하면 XPath형식으로 반환할 대상을 지정할 수 있다.
 - 즉 아래처럼 html이 있을때,
<table>
  <tr>
    <td><a href="http://blog.kangwoo.kr">나의 블로그</td>
    <td align="left"><div>나는 누굴까?</div></td>
  </tr>
  <tr>
    <td><a href="http://blog.kangwoo.kr">너의 블로그</td>
    <td align="left"><div>너는 누굴까?</div></td>
  </tr>
  <tr>
    <td><a href="http://blog.kangwoo.kr">우리의 블로그</td>
    <td align="left"><div>우리는 누굴까?</div></td>
  </tr>
</table>


  "나는 누굴까?", "너는 누굴까?", "우리는 누굴까?"값만 가지고 오고 싶으면,
	Object[] objArray = node.evaluateXPath("//table//tr//td[@align='left']//div");
	for (Object obj: objArray) {
		TagNode t = (TagNode)obj;
		System.out.println(t.getText().toString());
	}


이런씩으로 구현하면 그 대상 node만 손쉽게 가져올 수 있다.


* 참고
BaseToken
  + CommentToken
  + ContentToken
  + DoctypeToken
  + TagToken
    + EndTagToken
    + TagNode



2. 불필요한 요소 제거
 -불필요한 요소를 제거 할려면, CleanerProperties 클래스의 setXXX() 메소드를 이용해서 설정해주면 된다.
	HtmlCleaner cleaner = new HtmlCleaner();
	CleanerProperties props = cleaner.getProperties();
	props.setOmitComments(true); // 주석제거
	TagNode node = cleaner.clean(...);

CleanerProperties:

setAdvancedXmlEscape(boolean)
setUseCdataForScriptAndStyle(boolean)
setTranslateSpecialEntities(boolean)
setRecognizeUnicodeChars(boolean)
setOmitUnknownTags(boolean)
setTreatUnknownTagsAsContent(boolean)
setOmitDeprecatedTags(boolean)
setTreatDeprecatedTagsAsContent(boolean)
setOmitComments(boolean)
setOmitXmlDeclaration(boolean)
setOmitDoctypeDeclaration(boolean)
setOmitHtmlEnvelope(boolean)
setUseEmptyElementTags(boolean)
setAllowMultiWordAttributes(boolean)
setAllowHtmlInsideAttributes(boolean)
setIgnoreQuestAndExclam(boolean)
setNamespacesAware(boolean)
setHyphenReplacementInComment(String)
setPruneTags(String)
setBooleanAttributeValues(String)




3. XML로 만들어보기.
 - XmlSerializer 를 이용하면 손쉽게 XML형식으로 출력 가능하다.
	CleanerProperties props = cleaner.getProperties();
	TagNode node = cleaner.clean(...);
	XmlSerializer xmlSerializer = new SimpleXmlSerializer(props);
	xmlSerializer.writeXmlToStream(node, System.out);


 - DomSerializer 클래스를 이용해서, Document 객체로 변환도 가능하다.
	new DomSerializer(props, true).createDOM(node);


 * 참고 
  http://htmlcleaner.sourceforge.net/
  http://htmlparser.sourceforge.net/