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');
?>
Кто-нибудь знает, что происходит? Спасибо!
Ответы
Ответ 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);