Borrar item de lista de objetos (DOM)

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Borrar item de lista de objetos (DOM)

Mensaje por avechuche »

Hola que tal, tengo una lista de objetos "tr" $oTRs = $iID.firstElementChild.Children

Es posible eliminar de la coleccion $oTRs algún item en particular? Gracias!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Borrar item de lista de objetos (DOM)

Mensaje por Chefito »

la función removechild de javascript? :smt017 .
Que sería, cargarte un elemento de una lista de una página web cualquiera a través de autoit?
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Borrar item de lista de objetos (DOM)

Mensaje por avechuche »

Chefito escribió:la función removechild de javascript? :smt017 .
Que sería, cargarte un elemento de una lista de una página web cualquiera a través de autoit?
Gracias por la respuesta, ya probe con removeChild de todas las formas y nada (no quiere decir que lo haya hecho bien), voy a seguir probando si es que es eso. Lo segundo que me decis no lo entendi :). Estoy tomando todas las filas de una tabla, pero la primera, son los encabezados, entonces no la necesito, ahora lo solucione con un contador y que si es = 1. haga un ContinueLoop y listo, pero no me vendría mal saber borrar un item, si es que se puede.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Borrar item de lista de objetos (DOM)

Mensaje por Chefito »

Explícate mejor porque no acabo de entenderte :smt017 .
Entiendo que quieres eliminar un item de una lista de una página web, no?
O quieres eliminar un item de una lista hecha en autoit?

Si es en una página web, lo mejor que puedes hacer es poner la página web donde esté esa lista y decir claramente lo que quieres hacer.....o una página web que tenga algo muy parecido para poder trabajar sobre el objeto directamente. Tampoco estaría mal algo de código :smt001 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Borrar item de lista de objetos (DOM)

Mensaje por avechuche »

Chefito escribió:Explícate mejor porque no acabo de entenderte :smt017 .
Entiendo que quieres eliminar un item de una lista de una página web, no?
O quieres eliminar un item de una lista hecha en autoit?

Si es en una página web, lo mejor que puedes hacer es poner la página web donde esté esa lista y decir claramente lo que quieres hacer.....o una página web que tenga algo muy parecido para poder trabajar sobre el objeto directamente. Tampoco estaría mal algo de código :smt001 .

Saludos.
Aaaa ahora entendi lo que me preguntabas. Quiero eliminar un item de una lista hecha en autoit. La web entro por user y pass asi que pongo parte del código que me interesa.

Código: Seleccionar todo

<table id=filter_list>
  <body>
     </tr>ESTE TR NO ME SIRVE<tr>
     </tr>SIRVE<tr>
     </tr>SIRVE<tr>
     </tr>SIRVE<tr>
     ...
     ...
     </tr>SIRVE<tr>
  </body>
</table>
Asi capturo yo los "tr", es muchisimo mas rapido que el _IETagNameGetCollection

$oTRs = $iIDTable.firstElementChild.Children

Quiero eliminar de $oTRs el primer tr
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Borrar item de lista de objetos (DOM)

Mensaje por Chefito »

Por lo que entiendo, más que eliminar el primer elemento de la lista, por que no simplemente creas esa lista inicialmente sin el primer elemento? Sería más fácil y más correcto :smt002 .
Cuando dices lista, entiendo que es una lista desplegable, osea, un objeto combobox, no? Es que no es lo mismo un objeto combobox que listbox :smt003 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Borrar item de lista de objetos (DOM)

Mensaje por avechuche »

Chefito escribió:Por lo que entiendo, más que eliminar el primer elemento de la lista, por que no simplemente creas esa lista inicialmente sin el primer elemento? Sería más fácil y más correcto :smt002 .
Cuando dices lista, entiendo que es una lista desplegable, osea, un objeto combobox, no? Es que no es lo mismo un objeto combobox que listbox :smt003 .

Saludos.
No nos ponemos de acuerdo jajaja.
1) Cuando digo lista, me refiero al objeto que se crea, es una lista de ... o algo que se recorre con un For $oTR In $oTRs, no se como llamarlo, para mi es una lista de objetos "tr", lista, colección. Colección seria más correcto no? Bueno ya es tarde xD.
2) Crear la lista/colección sin el primer item, te referis a que borre el primer "tr" desde el HTML con removeChild y después haga $oTRs = $iIDTable.firstElementChild.Children?.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Borrar item de lista de objetos (DOM)

Mensaje por Chefito »

Cada vez me lio mas :smt005. Explica exactamente que quieres.
Yo entiendo que quieres coger todo el texto (los items) de una lista de una pagina web, menos el primero. Una vez que tienes esos items pienso que quieres trabajar con ellos en algun script autoit, como por ejemplo meterlos en una gui, en un control combobox. Vamos, eso es lo que yo pienso :smt017 . Si es eso, como te dije antes, coge todos los items de la lista que esta en la pagina web y luego los tratas, quitando el primero. Eso es muy facil.

O lo que quieres es eliminar el primer elemento de la lista que esta en la pagina web? :smt017 . Vamos, eliminar el primer elemento para que no salga en la pagi a web.

Esto es lo que pasa cuando no nos explicamos bien y no ponemos nada de codigo ni leches :smt012
Seguro que es facil :smt002 .
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Borrar item de lista de objetos (DOM)

Mensaje por avechuche »

Chefito escribió:Cada vez me lio mas :smt005. Explica exactamente que quieres.
Yo entiendo que quieres coger todo el texto (los items) de una lista de una pagina web, menos el primero. Una vez que tienes esos items pienso que quieres trabajar con ellos en algun script autoit, como por ejemplo meterlos en una gui, en un control combobox. Vamos, eso es lo que yo pienso :smt017 . Si es eso, como te dije antes, coge todos los items de la lista que esta en la pagina web y luego los tratas, quitando el primero. Eso es muy facil.

O lo que quieres es eliminar el primer elemento de la lista que esta en la pagina web? :smt017 . Vamos, eliminar el primer elemento para que no salga en la pagi a web.

Esto es lo que pasa cuando no nos explicamos bien y no ponemos nada de codigo ni leches :smt012
Seguro que es facil :smt002 .
Jajaja noooooooo nada de eso jajaja
No puse más código porque pense que con eso bastaba, es algo muy sencillo.
El código HTML tiene una tabla con varias filas

Código: Seleccionar todo

<table id=filter_list>
  <body>
     <tr>ESTE TR NO ME SIRVE</tr>
     <tr>SIRVE</tr>
     <tr>SIRVE</tr>
     <tr>SIRVE</tr>
     <tr>SIRVE<7tr>
  </body>
</table>
Bueno yo para obtener al coleccion de objetos "tr" hago lo siguiente

$iID = _IEGetObjById($oIE, "filter_list")
$oTRs = $iID.firstElementChild.Children


Con ese código:
1) Capturo el objeto "table"
2) firstElementChild es el BODY
3) Children me devuelve la cantidad de hijos que tiene BODY, osea me devuelve la cantidad de filas que tiene la tabla incluida la cabezera, que es la que no quiero. En el ejemplo serian 5 hijos, si uno mostrara un MsgBox de $oTRs.length, mostraría 5. De los cuales, a mi me sirven 4, la cabezera no.

Depués si quiero trabajar con el objeto "$oTRs" hago

Código: Seleccionar todo

For $oTR In $oTRs

     $oTR.href ; Obtengo el link, si es que tiene, de ese elemento de la coleccion.
     $oTR.innerText
     ; En mi caso aca hago otras cosas, pero eso no importa, yo quiero borrar de la lista el primer $oTR, quedandome con 4 filas.

Next
Si pasaramos ese $oTRs a Array quedaria

0- TR // Cabezera
1- TR // 2 fila de la tabla (la primera con datos)
2- TR // 3 fila de la tabla
3- TR // 4 fila de la tabla
4- TR // 5 fila de la tabla

Quiero borrar la posicion 0.

Encontre una solucion

$iID.firstElementChild.removeChild($iID.firstElementChild.firstElementChild)

Con eso borro de la página web la primer fila de la tabla (la fila que no necesito) y después hago $oTRs = $iID.firstElementChild.Children con eso funciona, pero tendría que poder borrarlo desde $oTRs con au3.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Borrar item de lista de objetos (DOM)

Mensaje por Chefito »

Aaaaaayyyyyyyy, y sigues quedandote a medio. Muy bonita la explicacion.....que me imaginaba que hacias eso. Pero....y despues? Que quieres hacer con los datos? Con el array de los tr obtenidos? Eso no lo has dicho en ningun momento :smt017
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Borrar item de lista de objetos (DOM)

Mensaje por avechuche »

Chefito escribió:Aaaaaayyyyyyyy, y sigues quedandote a medio. Muy bonita la explicacion.....que me imaginaba que hacias eso. Pero....y despues? Que quieres hacer con los datos? Con el array de los tr obtenidos? Eso no lo has dicho en ningun momento :smt017
xD es que al caso no importa que hago con los datos, en realidad por cada TR, capturo la cantidad de TD y despuès hago varias cosas mas, pero eso no es lo importante. Lo que yo quiero es borrar el primer item del array de "tr". No quiero que cada vez que se haga el FOR tenga que preguntar "si es el primer item, entonces continueloop", quiero borrar del array el primer "tr" y nunca mas preguntar eso dentro del FOR.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Borrar item de lista de objetos (DOM)

Mensaje por Chefito »

Yo lo haría de esta forma (un ejemplo):

Código: Seleccionar todo

#include <Inet.au3>

$html=_INetGetSource("http://www.w3schools.com/html/html_tables.asp")
;~ ConsoleWrite($html)
$ahtml=StringRegExp($html,'<table class="reference" style="width:100%">[\x00-\xFF]*?</tr>([\x00-\xFF]*?)</table>',1)
$atr=StringRegExp($ahtml[0],'<tr>([\x00-\xFF]*?)</tr>',3)
For $n=0 To UBound($atr)-1
   ConsoleWrite('El objeto tr número ' & $n+1 & ':'& $atr[$n])
Next
Más rápido casi imposible :smt003 .
Por supuesto yo lo haría de la forma anterior....o otra parecida, ya que hay otros métodos parecidos y rápidos.

Pero te voy a poner un ejemplo de como se puede crear una variable array con la información de las columnas de una tabla excepto la cabecera. Se puede de hacer de varias formas, ya que para el manejo de objetos html hay muchas funciones. Tendrías que mirar el manejo de estos objetos con javascript y sus funciones. Busca en google :smt024 :smt023 .

Código: Seleccionar todo

#include <IE.au3>

Local $aRow[1], $numRows, $item, $n
$oIE=_IECreate("http://www.w3schools.com/html/html_tables.asp")
$oTable=_IETagNameGetCollection($oIE,"table",0)
$numRows=$oTable.rows.length
ReDim $aRow[$numRows-1]
For $item=1 To $numRows-1
    $aRow[$item-1] = $oTable.rows($item).innerhtml
Next
For $n=0 To UBound($aRow) - 1
   ConsoleWrite($aRow[$n] & @CR)
Next
Por supuesto, la primera forma es la mejor, ya que es muy rápida, no depende del internet explorer, y no da casi ningún tipo de error, lo que manejando el IE te puede dar algún error de fallo al cargar la página web u otra forma que tendrías que controlar por si acaso.
El control de errores de la primera forma es muy fácil.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Borrar item de lista de objetos (DOM)

Mensaje por avechuche »

Gracias Chefito.

La primera opción me sirve para algunas cosas (la voy a usar), no para todas, porque en momentos tengo que interactuar con botones y demas.

La segunda no es lo que necesito. Ahí estoy guardando los "innerHtml", osea estoy guardando texto plano en cada fila del array. Yo necesito un array de objetos TR para que cuando lo recorra pueda pedirle lo que quiera ($oTR.innerText, innerHtml, o lo que sea).
La solución más "linda" fue capturar la TABLA y borrar el primer TR con removeChild y después capturar los demas TR. Cuando plantie esta pregunta, pense que habia alguna funcion tipo "_ArrayDelete", donde le pasaba el Array de objetos TR y la posicion y lo borraba directamente, que de hecho, me extraña que no halla algo "tan sencillo" como eso.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Borrar item de lista de objetos (DOM)

Mensaje por Chefito »

avechuche escribió:La solución más "linda" fue capturar la TABLA y borrar el primer TR con removeChild y después capturar los demas TR. Cuando plantie esta pregunta, pense que habia alguna funcion tipo "_ArrayDelete", donde le pasaba el Array de objetos TR y la posicion y lo borraba directamente, que de hecho, me extraña que no halla algo "tan sencillo" como eso.
No te van a dar hecho todo lo que quieres específicamente :smt001 . Si no está la función, pues créala tú. Que te crees que es la udf IE? Funciones creadas por algún/os usuario/s utilizando las propiedades de los objetos, javascript, y autoit :smt024 . Puedes manejar objetos por tu cuenta, crear nuevos objetos con los elementos que tu quieras. Por ejemplo, para recorrer objetos puedes utilizar for.......in........ .

Si tienes más interés, métete en la carpeta de udfs que trae autoit, y mira las funciones de IE.au3 .

Y otra cosa. Decirte que está muy bien utilizar la udf IE, pero si te quieres meter en cosas más complicadas pero muchos más rápidas y con un manejo prácticamente total de toda la información de las páginas web y el protocolo http, mira la udf winhttp. Es la que prácticamente utilizo yo para casi todo lo que tenga que hacer con páginas webs. Eso sí, es algo más complicado de manejar.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Responder