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