Я создаю небольшое веб-приложение, которое поможет мне управлять и анализировать содержимое моих сайтов, и cURL - моя любимая новая игрушка. Я выяснил, как извлечь информацию обо всех видах элементов, как найти все элементы определенного класса и т. Д., Но я застрял на двух проблемах (см. Ниже). Я надеюсь, что есть какой-нибудь изящный ответ xpath, но если мне придется прибегнуть к регулярным выражениям, я думаю, это нормально. Хотя я не так хорош в регулярных выражениях, так что если вы думаете, что так будет лучше, я буду признателен за примеры ...
Довольно стандартная отправная точка:
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html = curl_exec($ch);
if (!$html) {
$info .= "<br />cURL error number:" .curl_errno($ch);
$info .= "<br />cURL error:" . curl_error($ch);
return $info;
}
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
и извлечение информации, например:
// iframes
$iframes = $xpath->evaluate("/html/body//iframe");
$info .= '<h3>iframes ('.$iframes->length.'):</h3>';
for ($i = 0; $i < $iframes->length; $i++) {
// get iframe attributes
$iframe = $iframes->item($i);
$framesrc = $iframe->getAttribute("src");
$framewidth = $iframe->getAttribute("width");
$frameheight = $iframe->getAttribute("height");
$framealt = $iframe->getAttribute("alt");
$frameclass = $iframe->getAttribute("class");
$info .= $framesrc.' ('.$framewidth.'x'.$frameheight.'; class="'.$frameclass.'")'.'<br />';
}
Вопросы / проблемы:
Как извлечь комментарии HTML?
Я не могу понять, как определить комментарии - они считаются узлами или что-то еще целиком?
Как получить все содержимое div, включая дочерние узлы? Так что, если div содержит изображение и пару ссылок, он найдет их и вернет мне все как блок HTML.