Ошибка разбора php proDOM - PullRequest
0 голосов
/ 15 января 2012

Я использую следующий код для синтаксического анализа документа dom, но в конце я получаю сообщение об ошибке «google.ac» является нулем или не строкой объектаи много ";", как я могу это исправить?

<?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);
                }
?>

1 Ответ

1 голос
/ 16 января 2012

Есть несколько проблем с кодом:

  1. Вы должны добавить опцию CURL - CURLOPT_RETURNTRANSFER - чтобы захватить вывод. По умолчанию вывод отображается в браузере. Как это: curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);. В приведенном выше коде $data всегда будет TRUE или FALSE (http://www.php.net/manual/en/function.curl-exec.php)

  2. $dom->loadHTML('$data'); неверно и не требуется

  3. Метод чтения тегов '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.

...