iPhone/developer

아이폰 개발 HTML 파싱 : hpple 설정

눈써비 2011. 8. 7. 12:26
아이폰을 사용하다 보면 티스토리 글목록을 아이폰내  UITableView에서 보여 주고 제목 클릭 시 내용을 보여주는 경우를 보게된다. 이번 독도 어플 개발 중 서문 등 내용을 보여주기 위해 이 부분을 공부해 보았다.
검색력도 딸리고 티스토리에서는 글 작성 API는 제공하는데 글목록을 다른데 못가져가게 해놨는지 ㅠㅠ
어쨋든 최후의 수단으로 HTML을 파싱하게 되었다.

뭐 잘 찾아보면 더 좋은 수가 있겠지만 이 방법은 표준에 준하는 각종 게시판들을 내 어플에 녹일 수 있는 방법을 제공하므로 차후에 방명록에서도 유용하게 쓰일 수 있겠다.

1. xcode에서 HTML을 파싱하기 위한 API 추가
    : hpple 를 사용했음
코드 조각이라는 블러그에 정리가 잘 되어 있음
http://www.codeme.co.kr/103
- Posted by cerd -


2. 이 때 HTML 파싱을 위해 XPath란 것이 사용됨
 XPath 에 관한 사용법 : http://www.w3schools.com/XPath/xpath_syntax.asp
 
3. XPath를 뽑아내기 위해 영문을 읽다보니 머리에 쥐가나서 검색 중 firfox를 사용하는 방법 발견!
 http://www.lovelgw.com/Blog/232
Author : 근원e -
위의 방법들을 조합하여 아이폰내에 독도와 관련한 카테고리만 표출 성공!!


혹시 링크가 깨지거나 작성자분이 지울 수 있으므로 원문도 복사해서 올립니다.
1번 항목
hpple 다운 : https://github.com/topfunky/hpple
참고 : http://stackoverflow.com/questions/405749/parsing-html-on-the-iphone
예제 :  사용 예제 

다운 받은 파일에서 아래의 6가지 파일을 프로젝트에 추가.
HTFpple.h/m
HTFppleElement.h/m
XPathQuery.h/m 

libxml2 경로를 프로젝트에 추가.
메뉴 > Project > Edit Project Settings > Header Search Paths
${SDKROOT}/usr/include/libxml2를 입력.
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/include/libxml2


libxml2 라이브러리를 프로젝트에 추가.
메뉴 > Project > Edit Project Settings > Other Linker Flags
-lxml2를 입력.

빌드완료 hpple의 사용준비 완료

코드 샘플
NSStringEncoding EUC_KR = -2147481280;NSString *htmlWillInsert = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"주소"] encoding:EUC_KR error:nil];NSData *htmlData = [htmlWillInsert dataUsingEncoding:NSUnicodeStringEncoding];TFHpple *xpathParser = [[TFHpple alloc] initWithHTMLData:htmlData];NSArray *elements = [xpathParser search:@"xPath구문"];	NSLog(@"%@", elements);	for (TFHppleElement *element in elements) {	NSLog(@"%@", [element content]);}[xpathParser release];

구글 이미지 파싱하여 원본 링크와 이미지 주소를 얻는 작업중 
encoding을 위와 같이 -2147481280으로 했더니 가끔 Unable to Parse가 뜸 
EUC_KR 부분을 NSASCIIStringEncoding으로 바꾸니 잘됨.
저작자 표시 비영리 변경 금지
3번 항목
가끔 웹 페이지를 파싱하거나 특정 웹 페이지에 값을 파싱해야할 경우가 있습니다. 물론 정규식을 이용해 파싱을 할수 있으나 너무 복잡하고 페이지가 변경될시에 즉각적으로 변경하는데 많은 시간이 걸립니다. 이런 문제를 해결하고 좀더 편리하게 HTML 에 요소들의 값을 가져오기 위해서 PHP DOM 을 이용 할 수 있습니다. 

PHP DOM 은 특별히 옵션을 주어 설치하지 않아도 기본적으로 사용할 수 있는 PHP 확장입니다. (--disable-dom 옵션을 주지 않았으면 사용가능)

XPath 란 DOM의 내부를 트리 형태로 접근하기 위한 경로를 지정하는 것입니다. 자세한 설명은 XML XPath 를 따로 다루기로 하겠습니다. ^^  일단 간단하게  XPath 는 XML의 요소를 접근 하기위한 경로를 표현하는 방식 까지만 알아 두시면 됩니다. 

일단 XPath를 사람 손으로 소스를 분석하면서도 알수 있겠지만 Firefox의 부가 기능 중에 하나인 Autopager를 이용해서 손쉽게 XPath를 계산 할 수 있습니다. 

AutoPager 부가 기능 다운로드 (https://addons.mozilla.org/en-US/firefox/addon/4925/)
사용자 삽입 이미지
부가기능을 설치 하셨으면 내용을 파실할 URL로 이동을 합니다.
사용자 삽입 이미지

이동을 하셨다면 동그라미 안에 십자표시된 아이콘을 눌러 브라우저의 원하는 부분을 선택을 합니다. 선택 한 후에는 Link XPath 부분에 선택된 XPath 및 유사한 XPath 의 일치 사항이 나옵니다 원하는 XPath 값을 선택을 하면 매치된 값이 하단 Results from ... 부분에 나옵니다. 자~ 이제 슬슬 XPath 를 이용해서 값을 추출 해 보겠습니다. 

원하시는 값을 출력하는 XPath 를 선택을 해줍니다. 
이 예제에서는 //div[@id='content']/div[@class='searchList']/ol/li/a[1] 를 이용하겠습니다. 

PHP 에서 이 XPath의 값을 이용해서 값을 추출해 보도록 하겠습니다. 
01./**
02.* XPath 로 웹 사이트의 데이터 파싱
03.*/
04.// DOM Document 로 읽어들일 주소
06. 
07.// 객체 생성
08.$oDom= newDOMDocument();
09.// URL 로드
10.@$oDom->loadHTMLfile($strUrl);
11. 
12.// DOM XPath 객체 생성
13.$oXPath= newDOMXPath($oDom);
14. 
15.// XPath 표현에 해당하는 값을 가져온다.
16.$oElement= $oXPath->query("//div[@id='content']/div[@class='searchList']/ol/li/a[1]");
17. 
18.// 찾아진 횟수만큼 반복한다.
19.foreach($oElementas$key=> $oDOMnode)
20.{
21.// $oDOMnode 는 DOMNode 객체임
22.// nodeValue 는 값을 가지고 옴
23.echo$oDOMnode->nodeValue . "<br>";
24. 
25.// Anchor 테그에서 href 속성의 값을 가지고 옴
26.echo$oDOMnode->getAttribute('href') . "<br>";
27.echo"<br>";
28.}
29. 
30./**
31.* 결과
32.*
33.2010/06/25 Apache mod_deflate
34./Blog/231
35. 
36.2010/06/23 PHP mysql_conenct() Can't connect to local MySQL server through socket '/tmp/mysql.sock' (1)
37./Blog/230
38. 
39.2010/06/22 [자축] Atom Home Server 가동 1주년
40./Blog/228
41. 
42.2010/06/21 [보안] MySQL 암호화
43./Blog/224
44. 
45.2010/06/17 이미지 워터 마크 (PNG Alpha 채널 이용)
46./Blog/222
47. 
48.2010/06/16 홈 서버 토렌트 머신
49./Blog/221
50. 
51.2010/06/16 PHP Stream 제어
52./Blog/217
53. 
54.2010/06/15 MySQL Prepared Statements
55./Blog/216
56. 
57.2010/06/04 MySQL 결과 회전
58./Blog/205
59. 
60.2010/06/03 PHP 성능향상
61./Blog/204
62. 
63.2010/06/02 PHP Session 공유 (memcached 이용)
64./Blog/203
65. 
66.*/

참 쉽죠?  위 처럼 PHP DOM을 이용해서 웹 페이지에 원하는 값을 손쉽게 얻어 올 수 있습니다.

정규식을 이용해서 웹 페이지에서 값을 추출하는 것 보다 훨씬 빠르게 , 손쉽게 그리고 정확하게 추출 할 수 있습니다. 웹 페이지 파싱을 PHP DOM을 이용해서 추출 하면 매우 편리하게 원하시는 값을 얻을 수 있습니다. ^^

조금더 윤택한 코딩을 위해~ 하나씩~ 하나씩~ ㅋㅋㅋ


 두가지를 잘 조합하면 성공!
반응형