Подтвердить что ты не робот

Dom loadHTML не работает должным образом на сервере

Я запускаю код сначала на MAMP, и он работал очень хорошо. Но когда я попытался запустить код на другом сервере, у меня появилось много предупреждений вроде:

Предупреждение: DOMDocument:: loadHTML(): Неожиданный конечный тег: head в Entity, line: 3349 в /cgihome/zhang 1/html/cgi-bin/getPrice.php в строке 17 Предупреждение: DOMDocument:: loadHTML(): htmlParseStartTag: неправильный тег в Entity, строка: 3350 в /cgihome/zhang 1/html/cgi-bin/getPrice.php on строка 17 Предупреждение: DOMDocument:: loadHTML(): заголовок тега недействителен в Объект, строка: 3517 в /cgihome/zhang 1/html/cgi-bin/getPrice.php on строка 17

Коды следующие:

<?php
 $amazon = file_get_contents('http://www.amazon.com/blablabla');
 $doc = new DOMdocument();
 $doc->loadHTML($amazon);
 $doc->saveHTML();
 $price = $doc -> getElementById('actualPriceValue')->textContent;
 $ASIN = $doc -> getElementById('ASIN')->getAttribute('value');
?>

Кто-нибудь знает, что происходит? Спасибо!

4b9b3361

Ответ 1

Чтобы отключить предупреждение, вы можете использовать

libxml_use_internal_errors(true);

Это работает для меня. Manual

Фон: вы загружаете недействительный HTML. Недопустимый HTML довольно распространен, DOMDocument::loadHTML исправляет большинство проблем, но дает предупреждения по умолчанию.

С помощью libxml_use_internal_errors вы можете управлять этим поведением. Установите его перед загрузкой документа:

libxml_use_internal_errors(true);
$doc->loadHTML($amazon);

Ответ 2

Вы можете подавить предупреждение следующим образом:

@$doc->loadHTML($amazon);

Ответ 3

Эта проблема связана с кодом xHTML

Поскольку DOMdocument() может обрабатывать только чистый XHTML, вам нужно очистить свой код

У Php есть расширение, которое делает работу довольно хорошо. Вызывается Tidy php.net/book.tidy

Это может быть сложно, поскольку вам может понадобиться включить его в php.ini

Тогда

$tidy_config = array( 
                     'clean' => true, 
                     'output-xhtml' => true, 
                     'show-body-only' => true, 
                     'wrap' => 0, 

                     ); 

$tidy = tidy_parse_string( $html, $tidy_config, 'UTF8'); 
$tidy->cleanRepair(); 
$doc = new DOMdocument();
$doc->loadHTML( (string) $tidy);