Я использую следующий код для синтаксического анализа документа dom, но в конце я получаю сообщение об ошибке «google.ac» является нулевым или нет строки объекта 402 char 1
Я думаю, строка 402 содержит тег и множество «;», как я могу это исправить?
<?php //$ch = curl_init("http://images.google.com/images?q=books&tbm=isch/"); // create a new cURL resource $ch = curl_init(); // 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); // grab URL and pass it to the browser $data = curl_exec($ch); curl_close($ch); $dom = new DOMDocument(); $dom->loadHTML($data); //@$dom->saveHTMLFile('newfolder/abc.html') $dom->loadHTML('$data'); // find all ul $list = $dom->getElementsByTagName('ul'); // get few list items $rows = $list->item(30)->getElementsByTagName('li'); // get anchors from the table $links = $list->item(30)->getElementsByTagName('a'); foreach ($links as $link) { echo "<fieldset>"; $links = $link->getElementsByAttribute('imgurl'); $dom->saveXML($links); } ?>
В коде есть несколько проблем:
Вы должны добавить опцию 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-> (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.