2012-05-14 19 views
5

Decir que tengo un archivo html que he cargado, yo funciono con esta pregunta:PHP XPath: Obtener todos los de href que contienen "letra"

$url = 'http://www.fangraphs.com/players.aspx'; 
$html = file_get_contents($url);  
$myDom = new DOMDocument; 
$myDom->formatOutput = true; 
@$myDom->loadHTML($html); 
$anchor = $xpath->query('//a[contains(@href,"letter")]'); 

Eso me da una lista de estos anclajes que se parecen a la siguiente :

<a href="players.aspx?letter=Aa">Aa</a> 

Pero necesito una forma de obtener solo "players.aspx? Letter = Aa".

pensé que podría intentar:

$anchor = $xpath->query('//a[contains(@href,"letter")]/@href'); 

Pero eso me da un error de PHP diciendo que no podía añadir nodo cuando intento el siguiente:

$xpath = new DOMXPath($myDom); 
$newDom = new DOMDocument; 
$j = 0; 
while($myAnchor = $anchor->item($j++)){ 
    $node = $newDom->importNode($myAnchor, true); // import node 
    $newDom->appendChild($node); 
} 

alguna idea de cómo obtener simplemente el valor de las etiquetas href que selecciona la primera consulta? ¡Gracias!

+0

Esto funciona sin ningún tipo de error para mí .. puedo ver más de un código, por ejemplo, el xml que es el DOM para newDom? –

+0

Sí, lo siento, no estaba claro.No era XML, es un archivo HTML cargado. ¿Podría echar un vistazo a la publicación original otra vez? He editado la parte superior para reflejar cómo obtengo el DOM. – sfgiants2010

+0

Todavía no es suficiente - te falta donde 'xpath' y' newDom' se inicializan –

Respuesta

0

Su consulta XPath está devolviendo atributos en sí mismos (es decir, objetos DOMAttr) en lugar de elementos (es decir, objetos DOMElement). Eso está bien, y eso parece ser lo que quieres, pero anexarlos al documento es el problema. Un DOMAttr no es un nodo independiente en el árbol de documentos; está asociado con un DOMElement pero no es un hijo en el sentido habitual. Por lo tanto, anexar directamente un DOMAttr al documento no es válido.

De the W3C specs:

Attr objetos heredan la interfaz Node, pero dado que no son en realidad nodos secundarios del elemento que describen, el DOM no los consideran parte de la estructura del documento. . . . El DOM considera que los atributos son propiedades de los elementos en lugar de tener una identidad separada de los elementos que están asociados con

Cualquiera de asociar el DOMAttr con un DOMElement y anexar ese elemento, o tire de valor la DOMAttr 's y usa eso como desees.

Para anexar su valor de texto sin formato, use su valor en un nodo DOMText y añádalo. Por ejemplo, cambie esta línea:

$newDom->appendChild($node); 

a esto:

$newDom->appendChild(new DOMText($node->value)); 
0

probar esto ..

$xml_string = 'your xml string'; 
$xml = simplexml_load_string($xml_string); 
foreach($xml->a[0]->attributes() as $href => $value) { 
    $myAnchorsValues[] = $value; 
} 

var_dump($myAnchorsValues); 
+0

En realidad no es xml ... es un archivo HTML cargado en un DOMDocument. ¿Podrías mirar otra vez la publicación original? Edité la parte superior para incluir de dónde obtengo el contenido. – sfgiants2010

+0

puede probar con este analizador: http://simplehtmldom.sourceforge.net/ funcionó para mí. si necesita un ejemplo hágamelo saber, pero es muy claro en la documentación. – BruneX

3

Uso:

//a/@href[contains(., 'letter')] 

Esto selecciona cualquier href atributo de cualquier a cuyo valor de cadena (del atributo) contiene la cadena "letter".

Cuestiones relacionadas