Есть несколько проблем с кодом:
Вы должны добавить опцию CURL - CURLOPT_RETURNTRANSFER - чтобы захватить вывод. По умолчанию вывод отображается в браузере. Как это: curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
. В приведенном выше коде $data
всегда будет TRUE или FALSE (http://www.php.net/manual/en/function.curl-exec.php)
$dom->loadHTML('$data');
неверно и не требуется
Метод чтения тегов 'li' и 'a' может быть неправильным, поскольку $ list-> item (30) всегда будет указывать на 30-й элемент
В любом случае, исправления. Я не уверен, что вы проверили HTML, возвращенный запросом CURL, но он отличается от того, что мы обсуждали в оригинальном сообщении . Другими словами, HTML, возвращаемый CURL, не содержит обязательных элементов <ul>
и <li>
. Вместо этого он содержит <td>
и <a>
элементов.
Надстройка : Я не очень уверен, почему HTML для одной и той же страницы отличается, когда он виден из браузера и читается из PHP. Но вот аргументация, которая, я думаю, могла бы подойти. На странице используется код JavaScript, который динамически отображает HTML-код при загрузке страницы. Этот динамический HTML можно увидеть при просмотре из браузера, но не из PHP. Следовательно, я предполагаю, что теги <ul>
и <li>
генерируются динамически. В любом случае, сейчас это не наше дело.
Поэтому вы должны изменить свой код, чтобы проанализировать элементы <a>
, а затем прочитать URL-адреса изображений. Этот фрагмент кода может помочь:
<?php
$ch = curl_init(); // create a new cURL resource
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://images.google.com/images?q=books&tbm=isch/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$data = curl_exec($ch); // grab URL and pass it to the browser
curl_close($ch);
$dom = new DOMDocument();
@$dom->loadHTML($data); // avoid warnings
$listA = $dom->getElementsByTagName('a'); // read all <a> elements
foreach ($listA as $itemA) { // loop through each <a> element
if ($itemA->hasAttribute('href')) { // check if it has an 'href' attribute
$href = $itemA->getAttribute('href'); // read the value of 'href'
if (preg_match('/^\/imgres\?/', $href)) { // check that 'href' should begin with "/imgres?"
$qryString = substr($href, strpos($href, '?') + 1);
parse_str($qryString, $arrHref); // read the query parameters from 'href' URI
echo '<br>' . $arrHref['imgurl'] . '<br>';
}
}
}
Надеюсь, выше имеет смысл. Но учтите, что приведенный выше синтаксический анализ может произойти сбой, если Google изменит их HTML.