WEB2015. 3. 27. 13:24
 
 
 
 


게시판의 게시물을 XML 으로 파싱하는 방법에 대해서 알아보겠습니다.


주로 타 사이트의 게시물 또는 정보를 가져와서 재가공을 해야 하는데, 가져와야 할 데이터가 너무 많아 수작업으로

만 할 수 없을 때 Simple HTML DOM Parser를 사용합니다.


소스는 아래의 사이트에서 다운로드하면 됩니다.




Simple HTML DOM Parser 는 PHP 5.0 버전 이상에서 실행되며, 따로 함수 설명은 하지 않고, 예제로 바로 들어갈게요.

저는 pgr21.com 홈페이지에서 자유게시판 글 목록을 파싱해보도록 하겠습니다. 


pgr21.com 자유게시판이 한 페이지를 다운받아 제 서버에 올렸어요.


위 사이트에 접속하여 소스보기를 해보면 게시물 목록이 다음과 같이 반복됨을 알 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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 함수를 이용해서 출력하면 됩니다.

Posted by 멍충이