[iOS] Html 파서, Hpple사용하기 (2)

2012. 3. 5. 17:53제2외국어/iOS

xCode 4.3에서 진행하였습니다.

(1)에서 Hpple을 사용하기 위한 셋팅을 끝냈고, (2)에서는 Hpple을 대충 사용해보겠습니다.

자 목표는 제가 NBA를 좋아하는 관계로 NBA-동부의 순위를 가져오는걸 목표로 진행하겠습니다.

[준비물]

1. NBA 팀별 순위가 적혀있는 URL ( 네이버 사랑합니다. )
   http://news.naver.com/sports/index.nhn?category=nba&ctg=record&mod=team_record

2. HTML 소스를 보게 하는 브라우저들
   모든 브라우저는 [ 오른쪽 버튼 -> 요소 검사 ] 를 통해 HTML 소스를 볼 수 있습니다만!!

   제가 추천하는 브라우저는 FireFox + 파폭의 부가기능 중 Auto Pager 라는 기능입니다.
   ( 이유는 나중에 알 수 있습니다. )

3. 난해한 제 글을 이해할 수 있는 수준의 지능입니다.



[ 시작하기 ]

(1)번에서 셋팅한 프로젝트를 그대로 진행하겠습니다.

ViewController.h 에

#import "TFHpple.h" 를 추가합니다


그리고 ViewController.m 에 함수를 하나 만들고 뷰가 로드될때 부르겠습니다.

/////////////////////////////////////////////////////////////////////////////////////////////////

 -(void)UseOfHpple

{

    NSString *_URL = [NSString stringWithContentsOfURL:

                      [NSURL URLWithString:@"http://news.naver.com/sports/index.nhn?category=nba&ctg=record&mod=team_record"]encoding:NSUTF8StringEncoding error:nil ];

    

    

    NSData *htmlData = [_URL dataUsingEncoding:NSUTF8StringEncoding];

    if (htmlData != nil) {

        

        TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];

        

        

        

        NSArray *parserArray = [xpathParser search:@"//div[@id='content']/table/tbody/tr/td/table/tbody/tr/td[1]"];

        TFHppleElement *element = [parserArray objectAtIndex:0];

        

        for(int i=0; i<[parserArray count]; i++)

        {

            NSLog(@"%@", [element content]);

        }

        

        

    }

    else {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"연결 실패"

                                                        message:@"데이터를 가져올 없습니다."

                                                       delegate:self cancelButtonTitle:@"확인" otherButtonTitles:nil];

        [alert show];

        

    }


}


- (void)viewDidLoad

{

    [super viewDidLoad];

    [self UseOfHpple];

}



/////////////////////////////////////////////////////////////////////////////////////////////////

 

소스를 대충 살펴보시면

NSString의 URL을 인코딩하여 NSData로

Hpple을 사용해서 HTML 데이터로 변환하고

파서를 사용하여 (구문 분석 -> 사용) Element로 쪼개서 뿌려줍니다.
 
xPath구문에 대한 정보 : http://www.w3schools.com/xpath/xpath_syntax.asp 




소스는 간단한데!
xPath 구문을 분석하고 사용하는게 제일 귀찮습니다.
이 때 파폭의 위력이 나타납니다.

//div[@id='content']/table/tbody/tr/td/table/tbody/tr/td[1]
위와 같이 복잡한 구문을 어떻게 뽑았는지 보겠습니다.



준비물에 있었던 것 처럼
파이어폭스깔고 --> 부가기능 (Auto Pager) 를 설치하면

파이어폭스에서 오른쪽 버튼을 눌렀을 경우 
다음과 같이 나옮니다.


1. Auto Pager --> XPath Utils --> Create XPath
 



2. (-- ing)



2. 원하는 항목 ( 전 팀명만 원하기 때문에 대표적으로 앞에 있는 '시카고'를 선택했습니다.)
   (빨간색 태두리로 범위를 알 수 있습니다.) 



3. (2)에서 선택하면 이렇게 됩니다.

[ 이쪽이 우리가 원하는 정보 ] 

확대해보면



Content XPath 를 보면 

목록이 뜨는데

목록을 눌러보면

Result from: ~~ 에

(목록에서) 선택한 구문의 결과가 뜨게됩니다.

이걸 보시면 팀명만 나온 구문을 얻을 수 있습니다.






//div[@id='content']/table/tbody/tr/td/table/tbody/tr/td[1] GET!!
 





아.... 힘들게 다 했는데!!
결과창을 돌려봤지만 되지를 않는군요

디버깅 결과 http://news.naver.com/sports/index.nhn?category=nba&ctg=record&mod=team_record 이 URL을 


인코딩할 때 NSUTF8StringEncoding 으로 인코딩이 되지 않는 문제점이 있습니다.
(네이버 전체가 안되는 줄 알았지만, 네이버 홈페이지는 되고, 뉴스 페이지 부터 저 인코딩으로는 되지 않습니다. )

뭐 이 방법을 사용해서 다른 URL에서 사용하시기 바랍니다.
 


PS. 해결법 알려주세요.