PHP HTML 파싱 예제
라이브러리를 이용하여 PHP 언어로 DOM 객체를 참조하며, 웹 페이지 컨텐츠 내용을 추출해 보는 내용을 예제와 함께 설명드리도록 하겠습니다.
이번 글에서 사용될 라이브러는 simplehtmldom 으로 HTML parser 라이브러리로 자바스크립트에서 DOM 객체를 접근하는 것처럼 쉽게 사용할 수 있으며, 다음과 같은 특징이 있습니다.
- 아주 간단한 방법으로 HTML DOM 객체를 참조 할 수 있습니다.
- PHP 5 이상 조건을 요구합니다.
- 올바르지 않은 형태의 HTML 파싱을 지원합니다.
- 태그 검색과 jQuery와 비슷한 형태의 DOM 객체 선택 기능을 지원합니다.
- 한줄의 라인으로 HTML의 컨텐츠를 추출 할 수 있습니다.
다양한 예제를 통해서, 이 라이브러리를 통해서 어떻게 컨텐츠 내용을 추출 할 수 있는지 설명 드리도록 하겠습니다. 보다 자세한 simplehtmldom 사용법은 아래의 페이지를 참고 하시면 됩니다.
라이브러리를 사용하기 전에 먼저 아래의 명령어로 PHP MBSTRING 패키지를 설치해 주시기 바랍니다.
$ sudo apt-get install php-mbstring
그리고 전체 예제 소스코드는 아래 git 명령어로 다운 받으실 수 있습니다.
$ git clone https://hiseon.me/reps/php-html-parser.git
위의 명령어로 예제 소스코드를 받으시면, lib 디렉터리 안에 simple_html_dom.php 파일이 존재합니다. 아래의 예제 코드를 실행하기 전에 반드시 이 소스코드를 포함 시킨뒤에 실행해 주셔야합니다.
만약 simple_html_dom.php 소스코드를 포함시키지 않고 아래의 예제를 실행하면 아래와 같은 오류가 발생 할 수 있습니다.
Call to undefined function file_get_html()
PHP HTML 파싱 예제
빠른 예제
아래의 예제는 기본 라이브러리 사용법을 보여주는 예제로 URL로 부터 컨텐츠를 다운로드 받은 뒤에 A 태그의 링크를 추출하는 내용입니다.
// URL로부터 DOM 객체를 생성
$html = file_get_html('https://hiseon.me/');
// 모든 이미지 태그를 검색 후 주소 출력
foreach($html->find('img') as $element) {
echo $element->src . '<br>';
}
// 모든 링크 주소를 출력
foreach($html->find('a') as $element) {
echo $element->href . '<br>';
}
file_get_html 함수를 호출할때 URL 주소를 전달하여 호출하였습니다. 만약 다운 로드 받은 HTML 소스코드를 이용하여 DOM 객체를 생성할 경우 file_get_html 함수 대신 아래의 함수를 사용하시면 됩니다.
$html = str_get_html($buffer);
HTML DOM 객체 생성방법
// 문자열로 부터 DOM 객체 생성
$html = str_get_html('<html><body>Hello!</body></html>');
// URL로부터 DOM 객체 생성
$html = file_get_html('https://hiseon.me/');
// test.htm 파일로 부터 DOM 객체 생성
$html = file_get_html('test.htm');
위의 내용은 다양한 방법으로 HTML DOM 객체를 생성 할 수 있다는 것을 보여줍니다. curl 라이브러리등 외부 라이브러리에서 컨텐츠를 다운 받은 뒤에 str_get_html 함수를 이용하여 HTML 내용을 파싱 할 수 있을 뿐더러 URL을 지정하면서 라이브러리 내부에서 컨텐츠를 받을 수도 있습니다.
그리고 직접 파일명을 지정하면서 파싱된 HTML DOM 객체를 생성할 수 있습니다.
HTML 객체 찾는 방법
// 모든 태그를 검색, DOM 객체의 배열을 리턴
$ret = $html->find('a');
// (N)번째 태그를 검색
$ret = $html->find('a', 0);
// 가장 마지막 태그를 검색
$ret = $html->find('a', -1);
// id속성값을 갖는 모든 <div> 태그를 검색
$ret = $html->find('div[id]');
// id=foo 인 모든 <div> 태그를 검색
$ret = $html->find('div[id=foo]');
위의 내용은 다양한 방법을 DOM 객체를 찾는 방법을 나타냅니다. DOM 객체를 찾지 못했을 경우 null 값을 리턴합니다.
HTML 객체의 속성 참조 방법
// 속성 내용을 참조
$value = $e->href;
// 속성 설정
$e->href = 'my link';
// 속성을 제거, 속성값을 null 으로 설정
$e->href = null;
// 속성값이 있는지 확인
if(isset($e->href)) {
echo 'href 존재합니다!';
}
DOM 객체에서 속성 내용을 참조하는 예제로, 속성값을 읽거나 설정할 수도 있습니다. 만약 값이 없는 속성일경우 (예, checked, selected 등) 속성값을 참조했을 경우 논리 값으로 true 또는 false 를 리턴하게 됩니다.
DOM 트리 순회 방법
// 예제
echo $html->find("#div1", 0)->children(1)->children(1)->children(2)->id;
// 또는
echo $html->getElementById("div1")->childNodes(1)->childNodes(1)->childNodes(2)->getAttribute('id');
위와 같은 자식 노드를 순회 할 수 있습니다.
HTML 태그 출력
// 내부 DOM 트리 정보를 문자열로 리턴
$str = $html;
// 내용을 출력
echo $html;
만약 A태그의 내용을 출력하면 다음과 같은 형태로 나타나게 됩니다.
<a href="https://hiseon.me/" title="HiSEON" rel="home">HiSEON</a>
웹페이지로 부터 컨텐츠를 가지고 오는 내용은 아래의 페이지를 참고하시면 됩니다.
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)