PHP DOMDocumentar cómo obtener ese contenido de esta etiqueta?

Estoy usando domDocument esperando analizar este pequeño código html. Estoy buscando una etiqueta span específica con una id específica.

 Hello world 

Mi código:

 $dom = new domDocument; @$dom->loadHTML($html); // the @ is to silence errors and misconfigures of HTML $dom->preserveWhiteSpace = false; $nodes = $dom->getElementsByTagName('//span[@id="CPHCenter_lblOperandName"'); foreach($nodes as $node){ echo $node->nodeValue; } 

Pero por alguna razón, creo que algo está mal con el código o el html (¿cómo puedo saberlo?):

  • Cuando cuento nodos con echo count($nodes); el resultado es siempre 1
  • No obtengo ningún resultado en el bucle de nodos
  • ¿Cómo puedo aprender la syntax de estas consultas complejas?
  • ¿Qué hice mal?

Puedes usar getElementById simple:

 $dom->getElementById('CPHCenter_lblOperandName')->nodeValue 

o en forma de selector:

 $selector = new DOMXPath($dom); $list = $selector->query('/html/body//span[@id="CPHCenter_lblOperandName"]'); echo($list->item(0)->nodeValue); //or foreach($list as $span) { $text = $span->nodeValue; } 

Su pregunta de cuatro partes obtiene una respuesta en tres partes:

  1. getElementsByTagName no toma una expresión XPath, debe darle un nombre de etiqueta;
  2. No se genera nada porque ninguna etiqueta podría coincidir con el nombre de etiqueta que proporcionó (consulte el n. ° 1);
  3. Parece que lo que quiere es XPath, lo que significa que necesita crear un objeto XPath; consulte los documentos de PHP para obtener más información;

Además, un método mejor para controlar los errores libxml es usar libxml_use_internal_errors (true) (en lugar del operador ‘@’, que también ocultará otros errores más legítimos). Eso te dejaría con un código que se ve así:

 < ?php libxml_use_internal_errors(true); $dom = new DOMDocument(); $dom->loadHTML($html); $xpath = new DOMXPath($dom); foreach($xpath->query("//span[@id='CPHCenter_lblOperandName']") as $node) { echo $node->textContent; }