2009-11-06 15 views

Respuesta

12

La razón de su error fatal es DOMDocument no tiene un método __toString() y por lo tanto no puede ser echo'ed.

Probablemente se esté buscando

echo $dom->saveHTML(); 
10

Hay 2 errores: el segundo se debe a $ dom hay ninguna cadena sino un objeto y por lo tanto no puede ser "eco". El primer error es una advertencia de loadHTML, causada por la sintaxis no válida del documento html para cargar (probablemente un & utilizado como separador de parámetros y no enmascarado como entidad con &).

Usted ignora y suprimir este mensaje de error (no el error, sólo el mensaje!) Llamando a la función con el operador de control de errores "@" (http://www.php.net/manual/en/language.operators.errorcontrol.php)

$dom->@loadHTML($html); 
50
$dom->@loadHTML($html); 

Esto es incorrecto, utilizar esto en su lugar:

@$dom->loadHTML($html); 
+24

o $ dom-> strictErrorChecking = false; – Tjorriemorrie

+3

Esta es una solución terrible ya que hará que errores en esta línea sean una pesadilla para depurar. La solución de @ Dewsworld es mucho mejor. – Gerry

+0

¿para qué es el '@'? –

83

apostaría que si uno mira en la fuente de http://www.somesite.com/ se encontraría caracteres especiales que no han sido convertidos a HTML. Tal vez algo como esto:

<a href="/script.php?foo=bar&hello=world">link</a> 

Debe ser

<a href="/script.php?foo=bar&amp;hello=world">link</a> 
+3

Solo para ampliar esto, si el carácter & está incluso en el texto y no en un atributo HTML, aún necesita ser escapado al &. La razón por la que el analizador arroja el error es porque después de ver un & está esperando un; para terminar la entidad HTML. – Kyle

+18

... y para ampliar aún más, al llamar 'htmlentities()' o similar en la cadena se solucionará el problema. – Ben

8

Independientemente del eco (que tendría que ser sustituido por print_r o var_dump), si se produce una excepción el objeto debe permanecer vacío:

DOMNodeList Object 
(
) 

Solución

  1. Conjunto recover en true y false strictErrorChecking

    $content = file_get_contents($url); 
    
    $doc = new DOMDocument(); 
    $doc->recover = true; 
    $doc->strictErrorChecking = false; 
    $doc->loadHTML($content); 
    
  2. entidad de codificación de uso php en el contenido del margen de beneficio, que es una fuente de error más común.

+1

En la primera solución escribiste dom en lugar de doc. – SinistraD

+0

esto funcionó para mí. Solo agregué $ content = mb_convert_encoding ($ content, 'HTML-ENTITIES', 'UTF-8'); – Prozi

114

para evaporar el aviso, puede utilizar libxml_use_internal_errors(true)

// create new DOMDocument 
$document = new \DOMDocument('1.0', 'UTF-8'); 

// set error level 
$internalErrors = libxml_use_internal_errors(true); 

// load HTML 
$document->loadHTML($html); 

// Restore error level 
libxml_use_internal_errors($internalErrors); 
3

Otra solución es possibile

$sContent = htmlspecialchars($sHTML); 
$oDom = new DOMDocument(); 
$oDom->loadHTML($sContent); 
echo html_entity_decode($oDom->saveHTML()); 
+0

Esto no funcionará. De acuerdo con http://php.net/manual/en/function.htmlspecialchars.php, todos los caracteres especiales html también se escapan. Tomemos por ejemplo esta pieza de código HTML ' Hello World'. Ejecutar esto en 'htmlspecialchars' producirá' <span> Hello World & lt/span > 'que ya no es HTML. DOMDocument :: loadHTML ya no lo tratará como HTML, sino como una cadena. –

+0

Esto funciona para mí: '' $ oDom = new DOMDocument(); $ oDom-> loadHTML ($ sHTML); echo html_entity_decode ($ oDom-> saveHTML()); '' –

7

reemplazar la sencilla

$dom->loadHTML($html); 

con el más robusto .. .

libxml_use_internal_errors(true); 

if (!$DOM->loadHTML($page)) 
    { 
     $errors=""; 
     foreach (libxml_get_errors() as $error) { 
      $errors.=$error->message."<br/>"; 
     } 
     libxml_clear_errors(); 
     print "libxml errors:<br>$errors"; 
     return; 
    } 
1

Sé que esto es una vieja pregunta, pero si alguna vez desea ot fijar las señales con formato incorrecto '&' en su HTML. Se puede utilizar código similar al siguiente:

$page = file_get_contents('http://www.example.com'); 
$page = preg_replace('/\s+/', ' ', trim($page)); 
fixAmps($page, 0); 
$dom->loadHTML($page); 


function fixAmps(&$html, $offset) { 
    $positionAmp = strpos($html, '&', $offset); 
    $positionSemiColumn = strpos($html, ';', $positionAmp+1); 

    $string = substr($html, $positionAmp, $positionSemiColumn-$positionAmp+1); 

    if ($positionAmp !== false) { // If an '&' can be found. 
     if ($positionSemiColumn === false) { // If no ';' can be found. 
      $html = substr_replace($html, '&amp;', $positionAmp, 1); // Replace straight away. 
     } else if (preg_match('/&(#[0-9]+|[A-Z|a-z|0-9]+);/', $string) === 0) { // If a standard escape cannot be found. 
      $html = substr_replace($html, '&amp;', $positionAmp, 1); // This mean we need to escapa the '&' sign. 
      fixAmps($html, $positionAmp+5); // Recursive call from the new position. 
     } else { 
      fixAmps($html, $positionAmp+1); // Recursive call from the new position. 
     } 
    } 
} 
1

No siempre es debido a los contenidos de la página y podría ser debido a la propia dirección URL.

Me encontré con este error recientemente y fue duo devolver el carácter del carro al final de la URL. La razón de la existencia de este personaje fue el error en la división de las URL.

$urls_array = explode("\r\n", $urls); 

en lugar de

$urls_array = explode("\n", $urls); 
1
$html = file_get_contents("http://www.somesite.com/"); 

$dom = new DOMDocument(); 
$dom->loadHTML(htmlspecialchars($html)); 

echo $dom; 

probar este

Cuestiones relacionadas