web-dev-qa-db-fra.com

Dom loadHTML ne fonctionne pas correctement sur un serveur

Je lance le code d'abord sur MAMP et cela a très bien fonctionné. Mais lorsque j'ai essayé d'exécuter le code sur un autre serveur, j'ai reçu de nombreux avertissements tels que: 

Avertissement: DOMDocument :: loadHTML (): balise de fin inattendue: head dans Entity, ligne: 3349 dans /cgihome/zhang1/html/cgi-bin/getPrice.php à la ligne 17 Avertissement: DOMDocument :: loadHTML (): htmlParseStartTag: balise mal placée dans Entity, line: 3350 dans /cgihome/zhang1/html/cgi-bin/getPrice.php sur ligne 17 Avertissement: DOMDocument :: loadHTML (): en-tête de balise invalide dans Entity, line: 3517 dans /cgihome/zhang1/html/cgi-bin/getPrice.php sur ligne 17

Les codes sont les suivants:

<?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');
?>

Quelqu'un sait ce qui se passe? Merci!

25
LuZ

Pour désactiver l'avertissement, vous pouvez utiliser 

libxml_use_internal_errors(true);

Cela fonctionne pour moi. Manuel

Arrière-plan: vous chargez du HTML non valide. Le HTML invalide est assez courant, DOMDocument::loadHTML corrige la plupart des problèmes, mais donne des avertissements par défaut.

Avec libxml_use_internal_errors vous pouvez contrôler ce comportement. Définissez-le avant de charger le document:

libxml_use_internal_errors(true);
$doc->loadHTML($Amazon);
102
hakre

Ce problème est lié au code non xHTML 

Comme DOMdocument () ne peut traiter que clean XHTML, vous devez nettoyer votre code 

Les PHP ont une extension qui fait assez bien le travail. Appelé Tidy php.net/book.tidy

Cela peut être délicat car vous aurez peut-être besoin de le activer dans votre php.ini 

Ensuite 

$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);
5
Pascal

Vous pouvez supprimer l'avertissement comme ceci:

@$doc->loadHTML($Amazon);
2
Aminah Nuraini