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"> </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 ответа
Если вы хотите работать с DOM, вы должны понять концепцию. Все в документе DOM, включая DOM Document, является узлом.
DOM Document представляет собой иерархическую древовидную структуру узлов. Начинается с корневого узла. Этот корневой узел может иметь дочерние узлы, и все эти дочерние узлы могут иметь дочерние узлы самостоятельно. В основном все в DOMDocument
тип узла, будь то элементы, атрибуты или текстовое содержимое.
HTML Legend:
/ \ UPPERCASE = DOMElement
HEAD BODY lowercase = DOMAttr
/ \ "Quoted" = DOMText
TITLE DIV - class - "header"
| \
"The Title" H1
|
"Welcome to Nodeville"
Диаграмма выше показывает DOM Document с некоторыми узлами. Существует корневой элемент (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.
Для создания парсера вы можете использовать htmlDOM.
Это очень простой и легкий в использовании парсер DOM, написанный на php. С его помощью вы можете легко получить содержимое div
тег.
Например, найти все div
теги, которые имеют атрибут id
со значением text
,
$ret = $html->find('div[id=text]');