2012-02-08 12 views
6

Digamos que tengo este código:Seleccionar nodeValue añadiendo los elementos secundarios

<p dataname="description"> 
Hello this is a description. <a href="#">Click here for more.</a> 
</p> 

¿Cómo se selecciona el nodeValue de p pero excluyo a y muestra su contenido?

Mi código actual:

$result = $xpath->query("//p[@dataname='description'][not(self::a)]"); 

lo selecciono por $result->item(0)->nodeValue;

Respuesta

10

Simplemente añadiendo/texto() a su consulta debe hacer el truco

$result = $xpath->query("//p[@dataname='description'][not(self::a)]/text()"); 
+0

Podría u PLS explicar por qué es así? – Michelle

+2

Sin/text() selecciona el nodo completo, incluidos sus elementos secundarios. Los nodos de elemento no tienen texto, sino que el texto se almacena en un nodo secundario llamado nodo de texto. nodeValue se usa para obtener el valor de texto de un nodo. Llamar a nodeValue en un nodo con hijos obtiene todos los nodos de texto secundarios y concatenarlos. Con/text() solo toma el primer nodo secundario de tipo texto y, por lo tanto, solo obtiene el texto de este nodo de texto – Kristofer

2

No está seguro si XPath de PHP soporta esto, pero esto XPath hace el truco para mí en Scrapy (Python marco basado en el raspado):

$xpath->query('//p[@dataname='description']/text()[following-sibling::a]') 

Si esto no funciona, pruebe la solución de Kristoffers, o también podría usar una solución de expresiones regulares. Por ejemplo:

$output = preg_replace("~<.*?>.*?<.*?>~msi", '', $result->item(0)->nodeValue);

Eso va a eliminar cualquier etiqueta HTML con cualquier contenido en él, con exclusión de texto que no está encapsulado por etiquetas HTML.

Cuestiones relacionadas