php - parser - Dom loadHTML no funciona correctamente en un servidor
php dom get element by tag name (3)
Este problema está relacionado con el código no xHTML
Como DOMdocument () solo puede procesar XHTML limpio , necesitas limpiar tu código
Php tiene una extensión que hace el trabajo bastante bien. Llamado Tidy php.net/book.tidy
Puede ser complicado ya que puede necesitar habilitarlo en su php.ini
Entonces
$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);
Primero ejecuté el código en MAMP y funcionó muy bien. Pero cuando intenté ejecutar el código en otro servidor, recibí muchas advertencias como:
Advertencia: DOMDocument :: loadHTML (): Etiqueta final inesperada: head en Entity, línea: 3349 en /cgihome/zhang1/html/cgi-bin/getPrice.php en la línea 17 Advertencia: DOMDocument :: loadHTML (): htmlParseStartTag: misplaced etiqueta en Entidad, línea: 3350 en /cgihome/zhang1/html/cgi-bin/getPrice.php en la línea 17 Advertencia: DOMDocument :: loadHTML (): Encabezado de etiqueta no válido en la Entidad, línea: 3517 en / cgihome / zhang1 / html /cgi-bin/getPrice.php en la línea 17
Los códigos son los siguientes:
<?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'');
?>
Alguien sabe lo que está pasando? ¡Gracias!
Para deshabilitar la advertencia, puede utilizar
libxml_use_internal_errors(true);
Esto funciona para mí. Manual
Fondo: Usted está cargando HTML no válido. HTML no válido es bastante común, DOMDocument::loadHTML
corrige la mayoría de los problemas, pero da advertencias de forma predeterminada.
Con Manual puedes controlar ese comportamiento. Configúralo antes de cargar el documento:
libxml_use_internal_errors(true);
$doc->loadHTML($amazon);
Puedes suprimir la advertencia así:
@$doc->loadHTML($amazon);