Как разобрать фактический HTML со страницы, используя CURL? - PullRequest
6 голосов
/ 04 августа 2010

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

<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.

Ответы [ 3 ]

4 голосов
/ 04 августа 2010

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

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

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

Но я думаю, что вы действительно хотите получить узлы '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>";
    }
}

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

1 голос
/ 05 августа 2010

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

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

0 голосов
/ 04 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...