Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

iOS에서 HTML parser인 Hpple 사용하기

틈틈히 iOS 스터디를 하고 있습니다. 간단한 프로젝트성으로 스터디용으로 만들어 보면서 HTML 파서가 필요했습니다. 당연히 엄청 많이 나올줄 알았는데 의외로 HTML 파서가 별로 없더군요. 대부분의 링크들이 거의 같은 얘기를 하고 있었고 SDK에 들어 있는 libxml을 Wrapping한 Hpple 라이브러리를 사용하고 있었습니다. 이 라이브러리가 2009년 7월이 마지막 업데이트이소 스스로 실험적인 목적으로 만든거라고 써놓은 것은 충격적이군요 ㅡㅡ;; (다른 분은은 다른 방법이 있는건지 libxml을 직접 쓰시는건지 궁금하군요.)




libxml 추가
Hpple를 쓰기전에 프로젝트에 libxml을 추가해야 합니다.

libxml 셋팅화면

메뉴에서 [Project] - [Edit Project Settings]에서 Header Search Paths에 libxml을 셋팅합니다.(위 화면은 셋팅한 다음에 캡쳐해서... ㅎ)

libxml 셋팅화면

${SDKROOT}/usr/include/libxml2 라고 추가해주고 Recursive에 체크해주면 됩니다.

libxml 셋팅화면

그 다음에 Other Linker Flags에다가 -lxml2을 추가해 줍니다.




Hpple 추가
Hpple는 github 저장소에서 다운로드를 받거나 소스를 내려받으면 됩니다.

사용자 삽입 이미지

내려받은 파일에서 Hpple프로젝트를 실행한 뒤에 프로젝트내의 Hpple폴더를 자신의 프로젝트로 복사해주면 됩니다. 저같은 경우는 Helpers쪽으로 분류해서 넣었습니다.


#import "TFHpple.h"

NSString *filepath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSData *data = [NSData dataWithContentsOfFile:filepath];
TFHpple *doc = [[TFHpple alloc] initWithHTMLData:data];
NSArray *elements = [doc search:@"//a[@class='sponsor']"];

TFHppleElement *element = [elements objectAtIndex:0];

[element content];              // Tag's innerHTML
[element tagName];              // "a"
[element attributes];           // NSDictionary of href, class, id, etc.
[element objectForKey:@"href"]; // Easy access to single attribute

사용법은 어렵지 않습니다. 프로젝트에 추가한 TFHpple.h를 임포트한 뒤에 HTML파일을 TFHpple객체로 만들어서 XPATH로 파싱을 하면 됩니다.(소스에 대부분은 Hpple의 가이드에 있는 소스입니다.) 저도 CSS Selector만 쓰다보니 XPATH는 별로 사용해 보지 않았는데 MSDN문서에 잘 나와 있습니다.
2011/05/11 02:33 2011/05/11 02:33