게시판의 게시물을 XML 으로 파싱하는 방법에 대해서 알아보겠습니다.
주로 타 사이트의 게시물 또는 정보를 가져와서 재가공을 해야 하는데, 가져와야 할 데이터가 너무 많아 수작업으로
만 할 수 없을 때 Simple HTML DOM Parser를 사용합니다.
소스는 아래의 사이트에서 다운로드하면 됩니다.
Simple HTML DOM Parser 는 PHP 5.0 버전 이상에서 실행되며, 따로 함수 설명은 하지 않고, 예제로 바로 들어갈게요.
저는 pgr21.com 홈페이지에서 자유게시판 글 목록을 파싱해보도록 하겠습니다.
pgr21.com 자유게시판이 한 페이지를 다운받아 제 서버에 올렸어요.
위 사이트에 접속하여 소스보기를 해보면 게시물 목록이 다음과 같이 반복됨을 알 수 있습니다.
123456789101112131415161718 <tr class="listnotice listtr" id="TR0"><!--<td class="tdcheck"><input type=checkbox name=cart value="405"></td>--><td class="tdnum">공지</td><td class="tdsub notice"><a href="pb.php?id=freedom&no=405" ><b>통합 공지사항 - 준수해주세요</b></a> <span class="pt7">[10]</span> <span id="Plus0"></span></td><td class="tdname"><span onMousedown="ZB_layerAction('zbLayer1','visible',event)" onMouseout='this.blur();' style='cursor:pointer'>Timeless</span></td><td class="tddate"><span title='2007년 02월 01일 11시 04분 47초'>07/02/01</span></td><td class="tdhit">160810</td><td class="tdvote">5</td></tr>cs
- 반복되는 tr 태그 기준으로 잘라서 읽어 옵니다.
- td 태그 안에 class 별로 구분하여, 제목, 작성자, 날짜를 저장해서 불러 오면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 |
<?
include "simple_html_dom.php";
if(!$_GET[page]) $page = 1;
else $page = $_GET[page];
$html = file_get_html("http://ibob.co.kr/source/pgr21_sample.html?id=freedom&page=".$page);
if($html)
{
header('Content-Type: text/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<rss version="2.0">
<channel>
<?
foreach($html->find('tr[class=listtr]') as $article) {
$title = $article->find('td.tdsub', 0)->plaintext;
$comment_cnt = preg_replace("/\].*|.*?\[/", "", $title);
$name = $article->find('td.tdname', 0)->plaintext;
$date = $article->find('td.tddate', 0)->plaintext;
?>
<item>
<name><?=htmlspecialchars($name)?></name>
<title><?=htmlspecialchars($title)?><?=$commenct_cnt?></title>
<date><?=htmlspecialchars($date)?></date>
</item>
<?
}
?>
</channel>
</rss>
<?
}
else
echo "error document";
?>
|
cs |
위 코드를 실행하면 아래와 같이 xml 코드를 얻을 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 |
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<item>
<name>Timeless </name>
<title>통합 공지사항 - 준수해주세요 [10] </title>
<date>07/02/01 </date>
</item>
<item>
<name>Leeka 210</name>
<title>기묘한 방법으로 날린 우리의 세금들 [1] </title>
<date>15/03/26 </date>
</item>
<item>
<name>뿜차네 집사 2476</name>
<title>[소소한 나눔] 혹시 콜라 좋아하세요? [137] </title>
<date>15/03/26 </date>
</item>
<item>
<name>사악군 6245</name>
<title>간통죄 위헌결정 이후 들어온 일 한가지. [54] </title>
<date>15/03/26 </date>
</item>
<item>
<name>SKY92 2926</name>
<title>2015 프로야구 개막전 선발 매치업 [31] </title>
<date>15/03/26 </date>
</item>
<item>
<name>AhnGoon 3312</name>
<title>안군의 기묘한 (여자) 모험...? [51] </title>
<date>15/03/26 </date>
</item>
<item>
<name>swordfish-72만세 1733</name>
<title>토탈워 로마2로 본 고대 로마군 이야기 [7] </title>
<date>15/03/25 </date>
</item>
</channel>
</rss>
|
cs |
이렇게 XML 로 만들어 봤지만, JSON 으로도 제작이 가능해요.
XML 출력을 하지말고, 위 결과물을 전부 배열에 저장하여, 아래의 json_encode 함수를 이용해서 출력하면 됩니다.
'WEB' 카테고리의 다른 글
비트코인, 이더리움, 이더리움클래식, 리플, 라이트코인 시세 한눈에 확인 (0) | 2017.05.31 |
---|