XPath 를 이용한 HTML 파싱
가끔 웹 페이지를 파싱하거나 특정 웹 페이지에 값을 파싱해야할 경우가 있습니다. 물론 정규식을 이용해 파싱을 할수 있으나 너무 복잡하고 페이지가 변경될시에 즉각적으로 변경하는데 많은 시간이 걸립니다. 이런 문제를 해결하고 좀더 편리하게 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/)
이동을 하셨다면 동그라미 안에 십자표시된 아이콘을 눌러 브라우저의 원하는 부분을 선택을 합니다. 선택 한 후에는 Link XPath 부분에 선택된 XPath 및 유사한 XPath 의 일치 사항이 나옵니다 원하는 XPath 값을 선택을 하면 매치된 값이 하단 Results from ... 부분에 나옵니다. 자~ 이제 슬슬 XPath 를 이용해서 값을 추출 해 보겠습니다.
원하시는 값을 출력하는 XPath 를 선택을 해줍니다.
이 예제에서는 //div[@id='content']/div[@class='searchList']/ol/li/a[1] 를 이용하겠습니다.
PHP 에서 이 XPath의 값을 이용해서 값을 추출해 보도록 하겠습니다.
/**
* XPath 로 웹 사이트의 데이터 파싱
*/
// DOM Document 로 읽어들일 주소
$strUrl = "http://www.lovelgw.com/Blog/search/PHP";
// 객체 생성
$oDom = new DOMDocument();
// URL 로드
@$oDom->loadHTMLfile($strUrl);
// DOM XPath 객체 생성
$oXPath = new DOMXPath($oDom);
// XPath 표현에 해당하는 값을 가져온다.
$oElement = $oXPath->query("//div[@id='content']/div[@class='searchList']/ol/li/a[1]");
// 찾아진 횟수만큼 반복한다.
foreach ($oElement as $key => $oDOMnode)
{
// $oDOMnode 는 DOMNode 객체임
// nodeValue 는 값을 가지고 옴
echo $oDOMnode->nodeValue . "
";
// Anchor 테그에서 href 속성의 값을 가지고 옴
echo $oDOMnode->getAttribute('href') . "
";
echo "
";
}
/**
* 결과
*
2010/06/25 Apache mod_deflate
/Blog/231
2010/06/23 PHP mysql_conenct() Can't connect to local MySQL server through socket '/tmp/mysql.sock' (1)
/Blog/230
2010/06/22 [자축] Atom Home Server 가동 1주년
/Blog/228
2010/06/21 [보안] MySQL 암호화
/Blog/224
2010/06/17 이미지 워터 마크 (PNG Alpha 채널 이용)
/Blog/222
2010/06/16 홈 서버 토렌트 머신
/Blog/221
2010/06/16 PHP Stream 제어
/Blog/217
2010/06/15 MySQL Prepared Statements
/Blog/216
2010/06/04 MySQL 결과 회전
/Blog/205
2010/06/03 PHP 성능향상
/Blog/204
2010/06/02 PHP Session 공유 (memcached 이용)
/Blog/203
*/참 쉽죠? 위 처럼 PHP DOM을 이용해서 웹 페이지에 원하는 값을 손쉽게 얻어 올 수 있습니다.
정규식을 이용해서 웹 페이지에서 값을 추출하는 것 보다 훨씬 빠르게 , 손쉽게 그리고 정확하게 추출 할 수 있습니다. 웹 페이지 파싱을 PHP DOM을 이용해서 추출 하면 매우 편리하게 원하시는 값을 얻을 수 있습니다. ^^
조금더 윤택한 코딩을 위해~ 하나씩~ 하나씩~ ㅋㅋㅋ
"PHP" 카테고리의 다른 글
- PHP 개발시 지키면 좋은 10 - 1 가지 (댓글 2개 / 트랙백 0개) 2010/06/30
- 웹(PHP) 개발에 유용(필요)한 유틸 (댓글 0개 / 트랙백 1개) 2010/05/12
- PHP Session 공유 (memcached 이용) (댓글 0개 / 트랙백 0개) 2010/06/02
- 복합 인자 사용방법 (댓글 0개 / 트랙백 0개) 2010/09/01
- PHP 성능향상 (댓글 0개 / 트랙백 0개) 2010/06/03
- PHP 변수를 이용해 객체 생성 (댓글 0개 / 트랙백 0개) 2010/05/11
- PHP 개발에 있어서 MVC 패턴의 적용 (댓글 2개 / 트랙백 0개) 2010/05/11
- PHP __autoload 이용 (댓글 0개 / 트랙백 0개) 2010/03/09
- 이미지 워터 마크 (PNG Alpha 채널 이용) (댓글 0개 / 트랙백 0개) 2010/06/17
- PHP Exception 활용 (댓글 0개 / 트랙백 0개) 2010/05/11
Trackback
Trackback Address :: http://www.lovelgw.com/Blog/trackback/232
