xpath - parser - Por qué// se necesita en lugar de/
scrapy xpath div id (2)
considere el siguiente código HTML:
<html>
<head>
<title>Example website</title>
</head>
<body>
<div>
<table id=''tableid''>
<tr>
<td>
<a href="/blabla" title="Blabla1">Blabla1</a>
<a href="/blabla" title="Blabla1">Blabla2</a>
<a href="/blabla" title="Blabla1">Blabla3</a>
<a href="/blabla" title="Blabla1">Blabla4</a>
</td>
<td>col2</td>
<td>col3</td>
<td>col4</td>
</tr>
</table>
</body>
</html>
Si quiero obtener todos los enlaces, ¿por qué tengo que usar:
//table[@id="tableid"]//a/@href
en cambio, si usa un solo / después de la mesa? Ya estoy en el nodo de la mesa en ese momento (debe convertirse en mi ''raíz'') así que / debería ser suficiente ...
¡gracias por adelantado!
Una sola / table[@id="tableid"] posterior table[@id="tableid"] funcionaría si solo quisiera hijos de table inmediatos. Para obtener un descendiente de la table[@id="tableid"] , necesita //a .
// es la abreviatura de /descendant-or-self::node()/
El eje de descendiente o auto contiene el nodo de contexto y los descendientes del nodo de contexto. Dado que está estableciendo el nodo de contexto como table[@id="tableid"] , no obtendrá ningún elemento que no sean aquellos que son descendientes de la table[@id="tableid"] .
//table[@id="tableid"]
Encontrará todos los elementos <table> con un id igual a tableid .
//a/@href
Agregado después de esto encontrará todos los elementos <a> dentro del elemento <table> , en cualquier posición (hijo, nieto ...)
Si está seguro de que todos los elementos <a> que necesita están debajo del primer <td> (tabla -> tr -> td), puede omitir el segundo // y hacer:
//table[@id="tableid"]/tr[1]/td[1]/a/@href
El /tr[1]/td[1] irá directamente a los elementos <a> .