DOMDocument в php - PullRequest
       33

DOMDocument в php

25 голосов
/ 12 февраля 2011

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

Ответы [ 2 ]

66 голосов
/ 13 февраля 2011

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

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>

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

<div class="header">

на самом деле представляет собой три узла: элемент DOME с элементом 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, просмотрите мои предыдущие ответы на связанные вопросы:

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

4 голосов
/ 12 марта 2014

Для создания парсера вы можете использовать htmlDOM .

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

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

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