Вопрос по PHP и xPath - PullRequest
       17

Вопрос по PHP и xPath

4 голосов
/ 14 февраля 2009

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

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

Я уже пытался повторить только эту строку, чтобы увидеть, что я получаю, но я просто получаю ту же ошибку, также я попытался поискать в поисках ошибки, но в итоге я оказался в документации 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);
    } 
}                                                   
?>

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

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

Ответы [ 3 ]

10 голосов
/ 14 февраля 2009

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

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

$elements = $xPath->query("//*[@class='nombrecomplejo']");

foreach ($elements as $e) {
  echo $e->nodeValue;
}

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

1 голос
/ 14 февраля 2009

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

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

@$dom->loadHTML($html);

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

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

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

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

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

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

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

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

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

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

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

Удачи!

1 голос
/ 14 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...