복붙노트

PHP의 DOMDocument

PHP

PHP의 DOMDocument

문서를 크롤링하고 구문 분석하기 위해 DOM에 대한 설명서와 예제를 읽기 시작했습니다.

예를 들어 아래에 표시된 문서의 일부가 있습니다.

    <div id="showContent">
    <table>
    <tr>
        <td>
         Crap
        </td>
    </tr>
<tr>
          <td width="172" valign="top"><a href="link"><img height="91" border="0" width="172" class="" src="img"></a></td>
          <td width="10">&nbsp;</td>
          <td valign="top"><table cellspacing="0" cellpadding="0" border="0">
              <tbody><tr>
                <td height="30"><a class="px11" href="link">title</a><a><br>
                    <span class="px10"></span>
                </a></td>
              </tr>
              <tr>
                <td><img height="1" width="580" src="crap"></td>
              </tr>
              <tr>
                <td align="right">
                    <a href="link"><img height="16" border="0" width="65" src="/buy"></a>
                </td>
              </tr>
              <tr>
                <td valign="top" class="px10">
                    <p style="width: 500px;">description.</p>
                </td>
              </tr>
          </tbody></table></td>
        </tr>
    <tr>
        <td>
Crap
        </td>
    </tr>
    <tr>
        <td>
         Crap
        </td>
    </tr>
    </table>
    </div>

모든 tr 태그를 가져 와서 그 안에 쓰레기 나 정보가 있는지 분석하려면 다음 코드를 사용하려고합니다.

$dom = new DOMDocument();
@$dom->loadHTML($html);

$xpath = new DOMXPath($dom);


$tags = $xpath->query('.//div[@id="showContent"]');
foreach ($tags as $tag) {
    $string="";
    $string=trim($tag->nodeValue);
    if(strlen($string)>3) {
        echo $string;
        echo '<br>';
    }
}

그러나 나는 단지 태그없이 문자열을 제거하고있다. 예를 들면 다음과 같다.

Crap

Crap
Title
Description

그러나 나는 얻고 싶다 :

<tr>
   <td>Crap</td>
</tr>
<tr>
   <a href="link">title</a>
</tr>

html 노드 (태그)를 유지하는 방법?

해결법

  1. ==============================

    1.DOM을 사용하여 작업하고 싶다면 개념을 이해해야합니다. DOMDocument를 포함한 DOM 문서의 모든 것은 노드입니다.

    DOM을 사용하여 작업하고 싶다면 개념을 이해해야합니다. DOMDocument를 포함한 DOM 문서의 모든 것은 노드입니다.

    DOMDocument는 노드의 계층 트리 구조입니다. 루트 노드로 시작합니다. 해당 루트 노드는 하위 노드를 가질 수 있으며 이러한 모든 자식 노드는 자체적으로 하위 노드를 가질 수 있습니다. 기본적으로 DOMDocument의 모든 요소는 요소, 속성 또는 텍스트 내용 일종의 노드 유형입니다.

              HTML                               Legend: 
             /    \                              UPPERCASE = DOMElement
           HEAD  BODY                            lowercase = DOMAttr
          /          \                           "Quoted"  = DOMText
        TITLE        DIV - class - "header"
         |             \
    "The Title"        H1
                        |
               "Welcome to Nodeville"
    

    위의 다이어그램은 노드가있는 DOMDocument를 보여줍니다. 두 개의 하위 항목이있는 루트 요소 (HTML)가 있습니다 (HEAD 및 BODY). 연결선을 축이라고합니다. TITLE 요소로 축을 따라 가면 DOMText 잎이 하나 있다는 것을 알 수 있습니다. 이것은 종종 간과되는 것을 보여주기 때문에 중요합니다.

    <title>The Title</title>
    

    하나가 아니라 두 개의 노드입니다. DOMText 자식이있는 DOMElement입니다. 마찬가지로, 이것은

    <div class="header">
    

    DOMText를 지닌 DOMAttr을 가진 DOMElement입니다. 이 모든 것들은 DOMNode로부터 속성과 메소드를 상속 받기 때문에 DOMNode 클래스에 익숙해 져야합니다.

    실제로 이것은 가져온 DIV가 문서의 다른 모든 노드에 연결되어 있음을 의미합니다. 루트 요소까지 또는 언제든지 잎 아래로 갈 수 있습니다. 모든 것이 있습니다. 원하는 정보를 얻기 위해 문서를 질의하거나 트래버스해야합니다.

    DIV의 childNode를 반복하거나 getElementByTagName () 또는 XPath를 사용하여이 작업을 수행하는지 여부는 귀하에게 달려 있습니다. 원시 HTML로 작업하지는 않지만 전체 HTML 문서를 나타내는 노드로 이해해야합니다.

    문서에서 특정 정보를 추출하는 데 도움이 필요하면 가져올 정보를 명확히해야합니다. 예를 들어, 테이블에서 모든 링크를 가져 오는 방법을 묻고 다음과 같이 대답 할 수 있습니다.

    $div = $dom->getElementById('showContent');
    foreach ($div->getElementsByTagName('a') as $link) 
    {
        echo $dom->saveXML($link);
    }
    

    그러나 더 구체적이지 않으면 어떤 노드가 관련이 있는지 추측 할 수 있습니다.

    관련 질문에 대한 이전 답변을 통해 DOM 탐색 방법에 대한 예제 및 코드 스 니펫이 더 필요하면 다음을 수행하십시오.

    지금까지는 DOM을 사용했을 때마다 기본에서 중간까지의 유스 케이스에 대한 스 니펫이 있어야합니다.

  2. ==============================

    2.파서를 만들려면 htmlDOM을 사용할 수 있습니다.

    파서를 만들려면 htmlDOM을 사용할 수 있습니다.

    PHP로 작성된 DOM 파서를 사용하는 것은 매우 간단합니다. 이것을 사용하면 div 태그의 내용을 쉽게 가져올 수 있습니다.

    예를 들어, 속성 ID가 text 인 모든 div 태그를 찾으십시오.

    $ret = $html->find('div[id=text]');
    
  3. from https://stackoverflow.com/questions/4979836/domdocument-in-php by cc-by-sa and MIT license