DOMDocument w php

Właśnie zacząłem czytać dokumentację i przykłady dotyczące DOM, aby indeksować i analizować dokument.

Na przykład mam część dokumentu pokazaną poniżej:

    <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>

Próbuję użyć poniższego kodu, aby pobrać wszystkie znaczniki tr i przeanalizować, czy w nich są bzdury lub informacje:

$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>';
    }
}

Jednak dostaję tylko stripped string bez tagów, na przykład:

Crap

Crap
Title
Description

Ale chciałbym dostać:

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

Jak zachować węzły html (tagi)?

Author: Templar, 2011-02-12

2 answers

Jeśli chcesz pracować z DOM, musisz zrozumieć tę koncepcję. Wszystko w dokumencie DOM, łącznie z dokumentem DOMDocument, jest węzłem.

DOMDocument jest hierarchiczną strukturą drzewa węzłów. Zaczyna się od węzła głównego. Ten węzeł główny może mieć węzły potomne, a wszystkie te węzły potomne mogą mieć węzły potomne same. Zasadniczo wszystko w DOMDocument jest rodzajem węzła, czy to elementy, atrybuty czy treść tekstowa.

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

Powyższy diagram pokazuje DOMDocument z kilkoma węzłami. Istnieje element root (HTML) z dwójką dzieci (głowa i ciało). Linie łączące nazywane są osiami. Jeśli podążasz wzdłuż osi do elementu TITLE, zobaczysz, że ma on jeden liść tekstu Dom. Jest to ważne, ponieważ ilustruje często pomijaną rzecz:

<title>The Title</title>

Nie jest jednym, ale dwoma węzłami. DOMElement z dzieckiem DOMText. Podobnie, to

<div class="header">

To tak naprawdę trzy węzły: DOMElement z DOMAttr trzymającym DOMText. Ponieważ wszystkie te dziedziczą swoje właściwości i metody z DOMNode, niezbędne jest zapoznanie się z klasą DOMNode.

W praktyce oznacza to, że pobrany DIV jest połączony ze wszystkimi innymi węzłami w dokumencie. Możesz przejść całą drogę do elementu korzeniowego lub w dół do liści w dowolnym momencie. Wszystko tu jest. Wystarczy zapytać lub przejść do dokumentu w celu uzyskania żądanych informacji.

Czy zrobisz to poprzez iterację childNodes z DIV lub użyj getElementByTagName() lub XPath zależy od Ciebie. Ty musisz tylko zrozumieć, że nie pracujesz z surowym HTML, ale z węzłami reprezentującymi cały dokument HTML.

Jeśli potrzebujesz pomocy w wyodrębnieniu konkretnych informacji z dokumentu, musisz wyjaśnić, jakie informacje chcesz z niego pobrać. Na przykład, można zapytać, jak pobrać wszystkie linki z tabeli, a następnie możemy odpowiedzieć coś w stylu:

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

Ale jeśli nie jesteś bardziej konkretny, możemy tylko zgadnąć, które węzły mogą być istotne.

Jeśli Potrzebujesz więcej przykładów i fragmentów kodu, jak pracować z DOM przejrzyj moje poprzednie odpowiedzi na powiązane pytania:

Do tej pory powinien być fragment dla każdej podstawowej i średniej bazy, którą możesz mieć z DOM.

 64
Author: Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:32:01

Aby utworzyć parser możesz użyć htmlDOM .

Jest to bardzo prosty, łatwy w użyciu parser DOM napisany w php. Za jego pomocą można łatwo pobrać zawartość znacznika div.

Na przykład Znajdź wszystkie znaczniki div, które mają atrybut {[3] } o wartości text.

$ret = $html->find('div[id=text]');
 4
Author: lokeshsk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-01 14:53:41