Я использую 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 может быть сложно работать, если вы не привыкли работать с полностью «жесткими» объектно-ориентированными интерфейсами.
Здесь нужно иметь в виду две вещи:
Почти все, возвращаемое методом DomDocument, является объектом
Большинство из этих объектов не могут быть преобразованы в строку
Таким образом, при попытке преобразовать DOMNodeList в строку, похоже, что вы ошибаетесь в коде, что означает, что по какой-то причине $ e является узлом NodeList, а не узлом.
Попробуйте повторить длину $ e->, чтобы увидеть, есть ли у вас ноделист определенной длины или итерация над $ e, чтобы выяснить, что внутри него. Вы также можете добавить эхо '.'; к вашему циклу, а затем подсчитайте точки, чтобы ваш запрос Xpath возвращал что-то ненулевой длины.
Я предполагаю, что ваш запрос xpath возвращает пустой список узлов здесь. Загрузите Firefox xPath Checker и нас, чтобы запустить ваш запрос xpath в вашем HTML-документе. Это позволит вам быть уверенными в том, что у вас есть правильный xPath, а затем вы можете сосредоточиться на выяснении части PHP. Когда я проверил, используя вашу страницу / код примера, я получил пустой результат.
Удачи!