DOMDocument в php

Я только что начал читать документацию и примеры о 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

Если вы хотите работать с DOM, вам нужно понять концепцию. Все в документе DOM, включая DOMDocument, является Node.

DOMDocument - иерархическая древовидная структура узлов. Он начинается с корня Node. У этого корня node могут быть дочерние узлы, и все эти дочерние узлы могут иметь дочерние узлы самостоятельно. В основном все в DOMDocument является типом node определенного типа, будь то элементы, атрибуты или текстовое содержимое.

          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>

не один, а два узла. DOMElement с дочерним элементом DOMText. Аналогично, этот

<div class="header">

действительно три узла: DOMElement с DOMAttr, содержащим DOMText. Поскольку все это наследует их свойства и методы от DOMNode, важно ознакомиться с классом DOMNode.

На практике это означает, что выбранный вами DIV связан со всеми другими узлами документа. Вы могли бы пройти весь путь до корневого элемента или до листьев в любое время. Это все. Вам просто нужно запросить или пересечь документ для необходимой информации.

Выполняете ли вы это путем итерации childNodes DIV или используйте getElementByTagName() или XPath зависит от вас. Вам просто нужно понять, что вы не работаете с необработанным HTML, но с узлами, представляющими весь HTML-документ.

Если вам нужна помощь в извлечении определенной информации из документа, вам необходимо уточнить, какую информацию вы хотите извлечь из нее. Например, вы можете спросить, как получить все ссылки из таблицы, а затем мы могли бы ответить на что-то вроде:

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

Но если вы не более конкретны, мы можем только догадываться, какие узлы могут быть релевантными.

Если вам нужно больше примеров и фрагментов кода о том, как работать с DOM, просмотрите мои предыдущие ответы на связанные вопросы:

К настоящему моменту должен быть фрагмент для каждого базового и среднего UseCase, который у вас может быть с DOM.

Ответ 2

Чтобы создать парсер, вы можете использовать htmlDOM.

Очень простой в использовании парсер DOM, написанный на php. Используя его, вы можете легко получить содержимое тега div.

Например, найдите все теги div, которые имеют атрибут id со значением text.

$ret = $html->find('div[id=text]');