Я пытаюсь очистить веб-страницу со следующими структурами на странице:
<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-анализа на стороне сервера. базовый пример