Вопросы PHP и xPath

Я использую PHP и xPath для сканирования на собственный сайт (просто сканирование html не входит в сервер), но я получаю эту ошибку:

Обрезаемая фатальная ошибка: объект класса DOMNodeList не может быть преобразован в строку в C: \ wamp \ www \ crawler.php в строке 46

Я уже пробовал повторять только эту строку, чтобы увидеть, что я получаю, но я бы просто получил ту же ошибку, и я попробовал googling для ошибки, но я, в конце концов, оказался в документации php и обнаружил, что мой пример точно так же, как и один в php-документации, кроме того, что я работаю с HTML вместо XML … поэтому я понятия не имею, что не так … вот мой код …

<?php $html = file_get_contents('http://miurl.com/mipagina#0'); // create document object model $dom = new DOMDocument(); // load html into document object model @$dom->loadHTML($html); // create domxpath instance $xPath = new DOMXPath($dom); // get all elements with a particular id and then loop through and print the href attribute $elements = $xPath->query("//*[@class='nombrecomplejo']"); if ($elements != null) { foreach ($elements as $e) { echo parse_str($e); } } ?> 

редактировать

На самом деле да жаль, что линия должна была протестировать, когда я прокомментировал другие вещи … Я удалил ее, но все еще есть ошибка.

Согласно документации , проверка « $elements != null » не нужна. DOMXPath::query() всегда возвращает DOMNodeList , хотя, возможно, он будет иметь нулевую длину, что не будет путать цикл foreach .

Также обратите внимание на использование свойства nodeValue для получения текстового представления элемента:

 $elements = $xPath->query("//*[@class='nombrecomplejo']"); foreach ($elements as $e) { echo $e->nodeValue; } 

Причиной ошибки является то, что вы не можете кормить ничего, кроме строки, в parse_str() , которую вы пытались передать в DOMElement .

Просто дикая догадка, но echo $ elements; строка 46, правда? Я считаю, что команда echo ожидает что-то, что является строкой или конвертируемой в строку, а $ элементов нет. Попробуйте удалить эту строку.

Здесь нет конкретных ответов, просто отладки.

Сначала удалите @ из

 @$dom->loadHTML($html); 

Может быть, есть предупреждение, которое вы тут же подавляете, что может помочь вам отладить проблему. Метод loadHTML не всегда может иметь дело с плохо сформированным HTML-кодом. В приведенном выше примере я получил следующее

 PHP Warning: DOMDocument::loadHTML(): htmlParseEntityRef: expecting ';' in Entity, line: 109 in /Users/alanstorm/Desktop/foo.php on line 7 

Если у вас есть возможность сделать это, установите аккуратное расширение и используйте его для получения чистого документа.

Кроме того, убедитесь, что на самом деле есть строка в $ html. Поскольку вы запрашиваете страницу через http, возможно, ваш IP блокируется по какой-либо причине.

Семейство классов / объектов DOMDocument может быть сложно работать, если вы не привыкли работать с полностью «жесткими» объектно-ориентированными интерфейсами.

Здесь нужно иметь в виду две вещи:

  1. Почти все, возвращаемое методом DomDocument, является объектом

  2. Большинство из этих объектов не могут быть преобразованы в строку

Таким образом, при попытке преобразовать DOMNodeList в строку, похоже, что вы ошибаетесь в коде, что означает, что по какой-то причине $ e является узлом NodeList, а не узлом.

Попробуйте повторить длину $ e->, чтобы увидеть, есть ли у вас ноделист определенной длины или итерация над $ e, чтобы выяснить, что внутри него. Вы также можете добавить эхо '.'; к вашему циклу, а затем подсчитайте точки, чтобы ваш запрос Xpath возвращал что-то ненулевой длины.

Я предполагаю, что ваш запрос xpath возвращает пустой список узлов здесь. Загрузите Firefox xPath Checker и нас, чтобы запустить ваш запрос xpath в вашем HTML-документе. Это позволит вам быть уверенными в том, что у вас есть правильный xPath, а затем вы можете сосредоточиться на выяснении части PHP. Когда я проверил, используя вашу страницу / код примера, я получил пустой результат.

Удачи!