XPath 를 이용한 HTML 파싱

2010/06/28 18:48

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/)
사용자 삽입 이미지
부가기능을 설치 하셨으면 내용을 파실할 URL로 이동을 합니다.
사용자 삽입 이미지

이동을 하셨다면 동그라미 안에 십자표시된 아이콘을 눌러 브라우저의 원하는 부분을 선택을 합니다. 선택 한 후에는 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" 카테고리의 다른 글

Trackback

Trackback Address :: http://www.lovelgw.com/Blog/trackback/232