tutorial parser mapcompose extract_first example español div xpath scrapy

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> .