Как анализировать фактический HTML со страницы с помощью CURL?

Я пытаюсь очистить веб-страницу со следующими структурами на странице:

<p class="row"> <span>stuff here</span> <a href="http://www.host.tld/file.html">Descriptive Link Text</a> <div>Link Description Here</div> </p> 

Я очищаю веб-страницу с помощью curl:

 <?php $handle = curl_init(); curl_setopt($handle, CURLOPT_URL, "http://www.host.tld/"); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($handle); curl_close($handle); ?> 

Я провел некоторое исследование и обнаружил, что я не должен использовать RegEx для анализа HTML, который возвращается из curl, и что я должен использовать PHP DOM. Вот как я это сделал:

 $newDom = new domDocument; $newDom->loadHTML($html); $newDom->preserveWhiteSpace = false; $sections = $newDom->getElementsByTagName('p'); $nodeNo = $sections->length; for($i=0; $i<$nodeNo; $i++){ $printString = $sections->item($i)->nodeValue; echo $printString . "<br>"; } 

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

 for($i=0; $i<$nodeNo; $i++){ $printString = $sections->item($i)->nodeValue; echo "<a href=\"<extracted link>\">LINK</a> " . $printString . "<br>"; } 

Как вы можете видеть, я не могу получить ссылку, потому что я получаю только текст веб-страницы, а не источник , как я хочу. Я знаю, что «curl_exec» тянет HTML, потому что я пробовал именно это, поэтому считаю, что DOM каким-то образом лишает HTML-код, который я хочу.

Согласно комментариям к руководству PHP по DOM , вы должны использовать следующее внутри своего цикла:

  $tmp_dom = new DOMDocument(); $tmp_dom->appendChild($tmp_dom->importNode($sections->item($i), true)); $innerHTML = trim($tmp_dom->saveHTML()); 

Это установит $innerHTML в HTML-содержимое узла.

Но я думаю, что вы действительно хотите получить узлы «a» под узлом «p», так что сделайте следующее:

 $sections = $newDom->getElementsByTagName('p'); $nodeNo = $sections->length; for($i=0; $i<$nodeNo; $i++) { $sec = $sections->item($i); $links = $sec->getElementsByTagName('a'); $linkNo = $links->length; for ($j=0; $j<$linkNo; $j++) { $printString = $links->item($j)->nodeValue; echo $printString . "<br>"; } } 

Это просто напечатает тело каждой ссылки.

Вы можете передать узел в DOMDocument::saveXML() . Попробуй это:

$printString = $newDom->saveXML($sections->item($i));

вы можете захотеть взглянуть на phpQuery для выполнения HTML-анализа на стороне сервера. базовый пример