2010-05-25 17 views
10

Necesito el contenido de la descripción y el contenido de la etiqueta de palabras clave. Tengo este código, pero no escribo nada. ¿Idea?obtener la etiqueta meta descripción con xpath

$str = <<< EOD 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 

<head> 

<meta name="description" content="text in the description tag" /> 

<meta name="keywords" content="text, in, the, keywords, tag" /> 

</head> 

EOD; 
$dom = new DOMDocument(); 

$dom->loadHTML($str); 

$xpath = new DOMXPath($dom); 
$nodes = $xpath->query('/html/head/meta[name="description"]'); 

foreach($nodes as $node){ 
    print $node->nodeValue; 
} 

Respuesta

23

Puede hacer referencia a los atributos utilizando @ seguido por el nombre del atributo (véase más adelante), y se puede consultar directamente para los atributos; su consulta XPath estaba casi allí.

// Look for the content attribute of description meta tags 
$contents = $xpath->query('/html/head/meta[@name="description"]/@content'); 

// If nothing matches the query 
if ($contents->length == 0) { 
    echo "No description meta tag :("; 
// Found one or more descriptions, loop over them 
} else { 
    foreach ($contents as $content) { 
     echo $content->value . PHP_EOL; 
    } 
} 
+0

Gracias. Esto funciona. – turbod

0

Asegúrese de que usted pone EOD; en una línea sin espacios y el sangrado como:

$str = <<< EOD 
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 

EOD; 
+0

¡Eso es bueno, el error es diferente! – turbod

2

Usted tiene dos problemas. En primer lugar, el nombre es un atributo por lo que deberán estar precedidos @,

$nodes = $xpath->query('/html/head/meta[@name="description"]'); 

En segundo lugar, los nodos están vacías así que no hay nada que imprimir.

Para imprimir el valor del atributo, hacer esto,

foreach($nodes as $node){ 
    $attr = $node->getAttribute('content'); 
    print $attr; 
} 
1

En lugar de incluir la parte/html/cabeza también se podría utilizar una doble barra que significa que el siguiente nodo puede ser en cualquier parte del código:

//meta[@name='description'] 

dará el mismo resultado como:

/html/head/meta[@name='description'] 

en realidad no importa mucho, pero es menos escribiendo ...

1

último, pero no menos , y perdón por revivir este hilo, , las consultas distinguen entre mayúsculas y minúsculas.

En otras palabras, si busca meta name = "description" ... o "meta name =" keywords ", no encontrará" meta name = "Description" ... o "meta name = "Palabras clave" ... Así que, respectivamente, cuidado con eso

y te puedo decir, después de trabajar un tiempo con XDOM y metatags, con el tiempo creo que el mejor enfoque para el que se va a utilizar esta función:.! http://php.net/manual/es/function.get-meta-tags.php

Cuestiones relacionadas