Писал тут на php один парсер, получал html-код, а его парсил через domdocument.

Чтобы не запутаться, и всё было наглядно, написал себе функцию, которая выводит структуру в удобном виде.


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

Вернёмся к функции. Она сырая, но работает как надо. Передаём ей один аргумент – $element типа DOMNode, чью структуру мы хотим получить. Возвращается html-код (просто текст с
для следующей строки и   для отступов)

Если текст слишком длинный, он сокращается до 97 символов, если пробелы (пустой после trim), то «empty text». Перед каждым элементом пишется его порядковый номер в родительском элементе. В квадратных скобках атрибуты. Значение атрибута style сокращается, так как обычно оно достаточно длинное. Удачи.

function DOMreturnStructure($element, $Off="") {
	$s = "";
	$cOff = $Off."      ";
	if ($element->hasChildNodes()) {
		$children = $element->childNodes;
		$i = 0;
		foreach ($children as $child) 
		{ 
			$s .= "$Off($i) ";
			if ($child->nodeName=="#text") {
				$s .= "#";
				if (count($child->nodeValue)>=100)
					$s .= substr($child->nodeValue, 0, 97)."...";
				else
					if (trim($child->nodeValue)=="")
						$s .= "empty text";
					else
						$s .= $child->nodeValue;
			}
			else
				$s .= $child->nodeName;
			$attrs = $child->attributes;
			if ($attrs->length!=0) {
				$s .= " [";
				foreach ($attrs as $attr) {
					if ($attr->nodeName=="style")
						$s .= $attr->nodeName."=<...>, ";
					else
						$s .= $attr->nodeName."=".$attr->nodeValue.", ";
				}
				$s .= "]";
			}
			$s .= "<br/>";
			$s .= DOMreturnStructure($child, $cOff);
			$i++;
		} 
	}
	return $s;
}