잡식[雜食]

PHP Simple HTML DOM Parser

쏘리다이 2019. 12. 12. 18:18

 

웹페이지 내의 특정 문자를 가져와 DB에 옮기기 위해 이것저것 시도해 보다가 원하는데로 되지 않아서 누군가가 만들어 놓은 라이브러리를 사용하려고 구글 검색을 하니 첫 페이지에 딱 저게 나오더군요.

예전에 잠시 사용한 경험도 있고(오류가 있어 일부 수정 후 사용했던 기억이...)해서 열어보니 최신버전이라고 해야 하나 암튼 2019년 11월 9일자 RC2가 있어서 얼른 다운로드 해서 로컬서버에 올려 보았습니다.

일단 예전처럼 단일 파일이 아닌관계로 뭐가 있나 살펴볼 참입니다.

인단 Example 폴더에 들어가 보니 scraping 폴더 하나와 example_advanced_selector, example_basic_selector, example_callback, example_extract_html, example_modify_contents 파일이 보입니다.

이중 다 필요한건 아니다 보니 selector와 html만 빠르게 보고 응용해 보기로 했습니다.

일단 examle_basic_selector을 열어 보았습니다.

 

// This example illustrates how to use basic selectors to retrieve HTML contents
include_once '../HtmlWeb.php';
use simplehtmldom\HtmlWeb;

 

뭐 일단은 상위 폴더의 HtmlWeb.php를 가져와 사용하는 걸로 봐선 필요한 클래스는 모두 저기 포함 되어 있는 것으로 생각됩니다.

use 는 네임스페이스를 쓰겠다는 거 같은데 PHP 5.3 이후 버전에 나온 기능이고 딱히 클래스에 흥미가 없기 때문에 패스

합니다.

// get DOM from URL or file
$doc = new HtmlWeb();
$html = $doc->load('http://www.google.com/');

 

간 크게도 구글 첫페이지를 가져오고 있네요.

일단은 HtmlWeb 메소드 생성하고 load 클래스로 구글페이지를 가져와서 $html 변수에 넣습니다.

 

// find all links
foreach($html->find('a') as $e)
	echo $e->href . '<br>' . PHP_EOL;

 

모든 링크를 찾는 방법으로 $html에 이는 모든 요소중 'a' 요소만 찾아서 속성인 html 값을 출력하는 기능입니다.

 

// find all images
foreach($html->find('img') as $e)
	echo $e->src . '<br>' . PHP_EOL;

 

모든 이미지 주소를 찾는 기능입니다.

 

// find all images with full tag
foreach($html->find('img') as $e)
	echo $e->outertext . '<br>' . PHP_EOL;

 

모든 이미지가 가진 outertext를 찾아 출력해 주는 말그대로 img 태그 그대로를 출력해 주는 기능입니다.

 

// find all div tags with id="gbar"
foreach($html->find('div#gbar') as $e)
	echo $e->innertext . '<br>' . PHP_EOL;

// find all span tags with class="gb1"
foreach($html->find('span.gb1') as $e)
	echo $e->outertext . '<br>' . PHP_EOL;

// find all td tags with attribute align="center"
foreach($html->find('td[align=center]') as $e)
	echo $e->innertext . '<br>' . PHP_EOL;

 

이 3개는 그 기능에 특이점이 없어 생략합니다.

 

// extract text from HTML
echo $html->plaintext . PHP_EOL;

 

이 기능은 페이지 그대로를 보여주는 기능이고 앞으로 확인차 많이 사용할 기능입니다.

이렇게 examle_basic_selector 예는 이미 알고 있는 기능의 복기 정도였고 example_advanced_selector가 어떤건지 살짝 기대가 됩니다.

 

// This example illustrates how to use advanced selector features
include_once '../HtmlDocument.php';
use simplehtmldom\HtmlDocument;

 

이번엔 상위폴더 HtmlDocument.php 를 사용하고 있습니다.

HtmlWeb과 무슨 차이가 있나 나중에 살펴봐야겠지만 구분을 한데는 뭔가 이유가 있을거라 생각 됩니다.

 

// -----------------------------------------------------------------------------
echo '<h2>Descendant selectors</h2>' . PHP_EOL;

echo $doc = <<<HTML
<div>
	<div>
		<div class="foo bar">ok</div>
	</div>
</div>
HTML;

echo (new HtmlDocument())->load($doc)->find('div div div', 0)->innertext . PHP_EOL;

 

따로 웹페이지를 가져 오지 않고 html을 바로 변수에 넣어 해당 변수에서 요소를 찾아 출력하는 방식을 보여주고 있습니다.

중첩된 DIV 레이어에서 제 안쪽의 문자를 출력하는 예제네요.

 

// -----------------------------------------------------------------------------
echo '<h2>Nested selectors</h2>' . PHP_EOL;

echo $doc = <<<HTML
<ul id="ul1">
	<li>item:<span>1</span></li>
	<li>item:<span>2</span></li>
</ul>
<ul id="ul2">
	<li>item:<span>3</span></li>
	<li>item:<span>4</span></li>
</ul>
HTML;

$html = (new HtmlDocument())->load($doc);

foreach($html->find('ul') as $ul) {
	foreach($ul->find('li') as $li)
		echo $li->innertext . '<br>' . PHP_EOL;
}

 

이것도 별반 다르지 않네요.  UL 리스트 안의 LI 라인 안의 내용을 출력하는 예제네요.

 

// -----------------------------------------------------------------------------
echo '<h2>Parsing checkboxes</h2>' . PHP_EOL;

echo $doc = <<<HTML
<form name="form1" method="post" action="">
	<input type="checkbox" name="checkbox1" value="checkbox1" checked>item1<br>
	<input type="checkbox" name="checkbox2" value="checkbox2">item2<br>
	<input type="checkbox" name="checkbox3" value="checkbox3" checked>item3<br>
</form>
HTML;

$html = (new HtmlDocument())->load($doc);

foreach($html->find('input[type=checkbox]') as $checkbox) {
	if ($checkbox->checked) {
		echo $checkbox->name . ' is checked<br>' . PHP_EOL;
	} else {
		echo $checkbox->name . ' is not checked<br>' . PHP_EOL;
	}
}

 

이거는 입력폼에 있는 테크 박스의 테크 여부를 출력해 주는 예제네요.  사용 여부에 따라 나름 유용한 기능이지 싶습니다.

기대했던 example_extract_html 웹은 별 기능이 없었습니다.

 

// This example illustrates how to extract text content from a webpage
include_once '../HtmlWeb.php';
use simplehtmldom\HtmlWeb;

$doc = new HtmlWeb();
echo $doc->load('https://www.google.com/')->plaintext;

 

다시금 간크게도 구글을 읽어와 그대로 뿌려주는 예제였습니다.  왜 이런식으로 분류를 해 놓은건지?

scraping 폴더까지 확인하면 좋겠지만 별다른건 없었습니다.

3개의 파일이 있는데 각각 사이트 주소만 틀리게 해서 문서를 읽어올 뿐 새롭다할 기능은 없었습니다.

뭐가 달라진거지?

일단 예전처럼 오류가 나지 않아 별도의 수정 작업은 하지 않아도 될 거 같습니다.

이상 간략한 PHP Simple HTML DOM Parser 예제 설명을 마치겠습니다.