[DocumentElement] DOMDocument имеет ложное содержание, в то время как [textContent] включает весь текст страницы

Я пытался выбрать контент на странице HTML. Проблема является результатом DOMDocument($html) не имеет элементов в своем узле [documentElement]. Однако все тексты HTML-страницы (кроме HTML-тегов) находятся внутри [textContent], Вот как я сделал DOMDocument объект:

$doc = new DOMDocument();
libxml_use_internal_errors(true);
$html = file_get_contents("https://example.com");
$doc->loadHTML($html);

И это выводимый объект:

DOMDocument Object (
[doctype]=> (object value omitted)
[implementation]=> (object value omitted)
[documentElement]=> (object value omitted)
[actualEncoding]=> utf-8
[encoding]=> utf-8
[xmlEncoding]=> utf-8
[standalone]=> 1
[xmlStandalone]=> 1
[version]=>
[xmlVersion]=>
[strictErrorChecking]=> 1
[documentURI]=>
[config]=>
[formatOutput]=>
[validateOnParse]=>
[resolveExternals]=>
[preserveWhiteSpace]=> 1
[recover]=>
[substituteEntities]=>
[nodeName]=> #document
[nodeValue]=>
[nodeType]=> 13
[parentNode]=>
[childNodes]=> (object value omitted)
[firstChild]=> (object value omitted)
[lastChild]=> (object value omitted)
[previousSibling]=>
[nextSibling]=>
[attributes]=>
[ownerDocument]=>
[namespaceURI]=>
[prefix]=>
[localName]=>
[baseURI]=>
[textContent]=> blah blah blah

Таким образом, я не могу просматривать теги HTML и выбирать конкретный контент. четное new DOMXpath($doc) не возвращает полезный контент, который я предполагаю, потому что DOMXpath($doc) зависит от [documentElement] узел DOMDocument объект. Вот вывод var_dump(new DOMXpath($doc));

object(DOMXPath)#2 (1) { ["document"]=> string(22) "(object value omitted)" }

Я пробовал оба curl а также file_get_contents методы для получения содержимого HTML, и я уверен, что содержимое HTML является правильным (я смог скопировать страницу HTML в файл PHP с помощью print_r($html), Кроме того, я прочитал несколько ответов по Stackru, но не смог решить проблему.

1 ответ

Решение

printr и DOMDocument не особенно полезны, информация есть, но она не очень хорошо отображается ((object value omitted) это намек).

Если вместо этого вы начинаете использовать методы DOMDocument, saveHTML или же saveXML, Они отформатируют фактический контент для вас... Если вы попробуете

$html = file_get_contents("https://example.com");
$doc->loadHTML($html);
echo "print_r()...";
print_r($doc);
echo "saveHTML()...";
echo $doc->saveHTML();

Вы должны увидеть разницу.

Следует отметить, что для вывода из определенной точки (например, из результата XPath) вы используете

echo $doc->saveHTML( $xpResultNode );

Изменить: с более конкретным кодом:

$doc = new DOMDocument();
$html = file_get_contents("https://example.com");
$doc->loadHTML($html);
$xp = new DOMXpath($doc);
$node = $xp->query('//*[@id="datacontainer"]/div[2]/table/tbody/tr[3]/td[4]/table/tr[2]/td');
echo $doc->saveHTML($node[0]);

Я немного изменил запрос XPath, так как на последнем уровне таблицы нет тега tbody.

Другие вопросы по тегам