Разбор PHP с DOM (без результатов) - PullRequest
1 голос
/ 02 февраля 2011

Я пытаюсь получить основной текст, расположенный в этом атрибуте класса span.

<span id="" style="color:#525B64;">The quick brown fox jumped over the lazy dog.</span>

Я проверил его на своем веб-сервере, и не вижу ошибок, но страница пуста.Я очень новичок в этом, поэтому я не знаю, куда идти.

Вот мой код.

<?php
// Load remote file, supress parse errors
libxml_use_internal_errors(TRUE);
$dom = new DOMDocument;
$dom->loadHTMLFile('http://somewebpage.com');
libxml_clear_errors();

// use XPath to find all nodes with a class attribute of header
$xp = new DOMXpath($dom);
$nodes = $xp->query('//span[@class="msgBody"]');

// output first item's content
echo $nodes->item(0)->nodeValue;
?>

Ответы [ 4 ]

3 голосов
/ 02 февраля 2011

В этом коде все выглядит нормально.

Я бы попробовал сделать следующее:

  • удалить строку, которая подавляет ошибки разбора.
  • загрузите удаленный файл с помощью file_get_contents, чтобы проверить, правильно ли он загружается
  • запросите документ с XPath, подобным //*, и переберите полученный результат DOMNodeList (с foreach), чтобы увидеть, правильно ли построено дерево.

Btw. чтобы исключить ошибки синтаксического анализа, сообщаемые методом ->loadHTMLFile(), я использую оператор @.

1 голос
/ 02 февраля 2011

Очень часто такое поведение происходит из-за пространства имен по умолчанию (проверьте, есть ли что-то подобное: xmlhs="http://www.w3.org/1999/xhtml").

Использование в выражениях XPath имен элементов, которые находятся в пространстве имен по умолчанию, является наиболее часто задаваемым вопросом в теге xpath - просто найдите « пространство имен по умолчанию xpath », чтобы найти много хороших ответов.

1 голос
/ 02 февраля 2011

Вы уверены, что в документе, который вы анализируете, есть только один элемент span с этим классом?

Может быть, ->item(0) возвращает пустой элемент, а нужный элемент следующий в списке?

1 голос
/ 02 февраля 2011

DOM создает узлы для всего: атрибуты, текст, комментарии, элементы, вы называете это. Таким образом, вам не нужно значение узла span, хотя может показаться, что вы хотите получить TextNode внутри диапазона и вместо него получить его значение . Попробуйте что-то вроде:

echo $nodes->item(0)->childNodes->item(0)->nodeValue

Вы также можете получить это непосредственно из запроса xpath:

$nodes = $xp->query('//span[@class="msgBody"]/text()');

(Хотя лично я никогда не имел большой удачи с xpath.)

...