LEER VARIAS COLUMNAS DE UNA TABLA HTML

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby cnavarro » Tue Aug 18, 2015 10:38 pm

joseluisysturiz wrote:Navarro, si meto en codigo en un archivo .txt luego puedo alimentar en TEXT INTO cCode--? ya que copie solo los td y tr de la tabla, lo coloque dentro del TEXT INTO cCode y pude leer todos las filas de la table y lo confirma porque la lleve a excel, solo habria que quitar el registro 1 que es los titulos de la table, ahora se esta viendo mucho mejor, revisare lo que enviastes nuevo.



La function que he puesto ya te devuelve una cadena ( cCode, por ejemplo ), ya no necesitas el TEXT INTO ..., no?

Y si lo tienes en un fichero, al leerlo tambien te devuelve la cadena
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6517
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby joseluisysturiz » Wed Aug 19, 2015 1:04 am

Ok, pruebo y aviso como va quedando, muchas gracias por tu gran ayuda, espero le sirva a alguien mas en un futuro no lejano, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby Carlos Mora » Thu Aug 20, 2015 9:39 am

cnavarro wrote:Prueba este codigo
El codigo Html da igual como lo pongas

Code: Select all  Expand view


TEXT INTO cCode
<table cellspacing="0" cellpadding="3" rules="all" bordercolor="Black" border="1" id="dgModelUser" bgcolor="#CCCCFF" width="400"><tr bgcolor="#AAAADD">
<td><font face="Verdana" size="1">Model</font></td>
<td><font face="Verdana" size="1">Type</font></td>
<td><font face="Verdana" size="1">Sub Type</font></td>
<td><font face="Verdana" size="1">Serial Nbr</font></td>
<td><font face="Verdana" size="1">Source</font></td></tr><tr>
<td><font face="Verdana" size="1">BR380JG-1</font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">1311</font></td>
<td><font face="Verdana" size="1">OTHER1</font></td>
<td><font face="Verdana" size="1">BR380JG-2</font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">1312</font></td>
<td><font face="Verdana" size="1">OTHER2</font></td>
<td><font face="Verdana" size="1">BR380JG-3</font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">1313</font></td>
<td><font face="Verdana" size="1">OTHER3</font></td>
<td><font face="Verdana" size="1">BR380JG-4</font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">1314</font></td>
<td><font face="Verdana" size="1">OTHER4</font></td>
<td><font face="Verdana" size="1">BR380JG-5</font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">1315</font></td>
<td><font face="Verdana" size="1">OTHER5</font></td>
<td><font face="Verdana" size="1">BR380JG-6</font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">1316</font></td>
<td><font face="Verdana" size="1">OTHER6</font></td>
<td><font face="Verdana" size="1">BR380JG-7</font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">  </font></td>
<td><font face="Verdana" size="1">1317</font></td>
<td><font face="Verdana" size="1">OTHER7</font></td></tr><tr>
ENDTEXT
 

Hola Cristobal,

el código que has puesto no es el de una tabla, tiene todas las celdas en una sola fila, no representa la tabla a la que se refiere José Luis.

Los tags más imortantes a la hora de la conversion son precisamente <tr> y <td>, bien puestos en su lugar. La idea general está muy bien, le falta un toquecito en el tema html, tengo alguna idea en la cabeza, dame un poco de tiempo para elaborarla.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby cnavarro » Thu Aug 20, 2015 10:06 am

Hola Carlos, saludos
Entiendo lo que dices, y, efectivamente, las lineas de las tablas deberían ir definidas por los códigos <tr> y </tr> y leer la tabla en funcion de esos símbolos, pero el código que adjuntó en el primer ejemplo Jose Luis no los incluía.
De todas formas, como en la linea de cabeceras si tenia esos codigos <tr>, era suficiente con leer esa linea y "contar" las columnas, para, en funcion de dicho numero no necesitar analizar el resto de lineas de codigo, solamente formalizar el formato del array en funcion de ese numero de columnas de la cabecera. Espero haberme explicado
Pero, dicho esto, evidentemente, la funcion para que estuviera completa debería contemplar dichos <simbolos><tr>, asi como el numero de <table></table> que quieres extraer de la pagina, ya que puedes tener varias en la misma.
Agradecido si puedes ampliar, completar el ejemplo
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6517
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby Carlos Mora » Thu Aug 20, 2015 10:41 am

Cristobal,
No me habia dado cuenta de que los TR no estaban, me guiaba por la imagen que puso Jose Luis. Te comento lo que había estado pensando, es bastante parecido a lo tuyo, con algunos detalles

1) Una tabla HTML está siempre encerrada entre '<table' y '</table>', por lo que con eso sacamos el sobrante de los datos. Nótese que digo '<table' y no '<table>', como el tag puede tener atributos es genérico.
2) dentro de ese código, cada fila está separada con '<tr'. No digo que termine con '</tr> porque el tag de cierre es opcional y, aunque generalmente está, no podemos confiarnos. Con esto separamos cada línea de datos
3) en cada línea, cada celda está separada por '<td', el cierre es opcional por lo que no se considera. Con esto separamos cada elemento en una linea.
4) cada elemento tendrá cosas irrelevantes que podemos quitar porque están encerradas entre '<>' porque son tags de html. Con eso deberíamos tener todo limpio. Entonces:

Code: Select all  Expand view

#include 'Fivewin.ch'
#include 'debug.ch'

#xcommand TEXT INTO <v> => #pragma __cstream|<v>:=%s
#xcommand TEXT INTO <v> ADDITIVE => #pragma __cstream|<v>+=%s

REQUEST HB_CODEPAGE_LTWIN
REQUEST HB_LANG_LT
REQUEST HB_GT_GUI

//------------------------------------------------------------------------------
FUNCTION Main()
//------------------------------------------------------------------------------
   LOCAL cCode

TEXT INTO cCode
 <table cellspacing="0" cellpadding="3" rules="all" bordercolor="Black" border="1" id="dgModelUser" bgcolor="#CCCCFF" width="400">
    <tr bgcolor="#AAAADD">
        <td><font face="Verdana" size="1">Model</font></td><td><font face="Verdana" size="1">Type</font></td><td><font face="Verdana" size="1">Sub Type</font></td><td><font face="Verdana" size="1">Serial Nbr</font></td><td><font face="Verdana" size="1">Source</font></td>
    </tr><tr>
        <td><font face="Verdana" size="1">330M</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1">ALL</font></td><td><font face="Verdana" size="1">CSS       </font></td>
    </tr><tr>
        <td><font face="Verdana" size="1">330M</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1">A10196-A10211</font></td><td><font face="Verdana" size="1">OTHER     </font></td>
    </tr><tr>
        <td><font face="Verdana" size="1">3D94</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1"> </font></td><td><font face="Verdana" size="1">PIPS      </font></td>
    </tr><tr>
        <td><font face="Verdana" size="1">4D105</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1"> </font></td><td><font face="Verdana" size="1">PIPS      </font></td>
    </tr><tr>
        <td><font face="Verdana" size="1">4D94</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1">&nbsp;</font></td><td><font face="Verdana" size="1"> </font></td><td><font face="Verdana" size="1">PIPS      </font></td>
    </tr>
ENDTEXT

XBrowser( TableToArray( cCode ) )

//------------------------------------------------------------------------------
FUNCTION TableToArray( cText )
//------------------------------------------------------------------------------
   LOCAL aTRs := {}
   LOCAL aTDs
   LOCAL nAt, nFrom, cTR, cTD

   // tags a remover de forma rápida para reducir el volumen de datos a procesar.
   aEval( {'</font>', '</span>', '<strong>', '</strong>', '<b>', '</b>', '<p>', '</p>', '<li>', '</li>', '<ol>', '</ol>'}, ;
          {|x| cText:= StrTran( cText, x ) } )

   // Para cada TR, que identificamos por los tags '<tr'
   DO WHILE ( nFrom:= At( '<tr', cText ) ) > 0
      IF ( nAt:= At('<tr', SubStr( cText, nFrom+3 ) ) ) == 0 // es la ultima fila
         nAt:= Len( cText )
      ENDIF
      cTR:= SubStr( cText, nFrom, nAt+2 ) // cTR es la linea

      cText:= SubStr(cText, nFrom+nAt+2) // Eliminamos la linea del texto a procesar

      // Lo extraemos del texto remanente y creamos un array con cada td de información
      aTDs:= {}
      // Para cada TD, que identificamos por los tags '<td' ...
      DO WHILE ( nFrom:= At( '<td', cTR ) ) > 0
         IF ( nAt:= At('<td', SubStr( cTR, nFrom+3 ) ) ) == 0 // es la ultima celda
            nAt:= Len( cTR )
         ENDIF
         cTD:= SubStr( cTR, nFrom, nAt+2 )
         cTR:= SubStr(cTR, nFrom+nAt+2)
         // Remover los todos los tags (entre '<' y '>') para dejar el text en limpio
         DO WHILE ( nAt:= At('>', cTD) ) > 0
            nFrom:= At( '<', cTD )
            cTD:= Left( cTD, nFrom - 1) + SubStr( cTD, nAt+1 )
         ENDDO
         // sacar espacios que están como html-entities,
         cTD:= StrTran( cTD, '&nbsp;', ' ' )
         // IF !Empty( cTD )
            // MsgInfo( cTD )
         // ENDIF
         aAdd( aTDs, cTD )

      ENDDO
      aAdd( aTRs, aTDs )

   ENDDO

RETURN aTRs

 


He obviado el 'recorte' de la TABLE, creo que es lo suficientemente sencillo.
Cosas que no tiene en cuenta: rowspans, colspans, y que los títulos y footers estén marcados con th, tfoot, cosas que pueden complicar el asunto, pero creo que salvo eso se debería comer todo lo que pertenezca a tr/td.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby cnavarro » Thu Aug 20, 2015 11:10 am

Carlos Mora wrote:Cristobal,
No me habia dado cuenta de que los TR no estaban, me guiaba por la imagen que puso Jose Luis. Te comento lo que había estado pensando, es bastante parecido a lo tuyo, con algunos detalles

He obviado el 'recorte' de la TABLE, creo que es lo suficientemente sencillo.
Cosas que no tiene en cuenta: rowspans, colspans, y que los títulos y footers estén marcados con th, tfoot, cosas que pueden complicar el asunto, pero creo que salvo eso se debería comer todo lo que pertenezca a tr/td.


Carlos, extraer solo los datos de una tabla de un codigo HTML es una cosa, y otra extraer todos los tags del codigo para intentar recrearla en un informe por ejemplo o en un Browse.
Tema, éste, muy interesante que llevo tiempo con intencion de desarrollar (el paso inverso, de report a HTML básicamente lo tengo hecho hace mucho tiempo, ya era en Clipper ). A ver si saco un rato y me pongo.
Saludos
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6517
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby Carlos Mora » Thu Aug 20, 2015 11:40 am

cnavarro wrote:... y otra extraer todos los tags del codigo para intentar recrearla en un informe por ejemplo o en un Browse...

No lo pillo... ¿Que otros tags? ¿Te refieres a FONT, B, etc?
La inversa sería teniendo codigo HTML obtener el oReport, no?

El codigo que te pasé no hace ninguna presunción que no sea que es una tabla HTML, es decir que en teoría deberia tolerar formateos y cosas por el estilo, con la salvedad hecha de los spans. Probablemente se pueda aprovechar para leer los tags contenidos en cada TD, la parte que los elimina hace el trabajo de buscarlos.
Saludos
Carlos Mora
http://harbouradvisor.blogspot.com/
StackOverflow http://stackoverflow.com/users/549761/carlos-mora
“If you think education is expensive, try ignorance"
Carlos Mora
 
Posts: 988
Joined: Thu Nov 24, 2005 3:01 pm
Location: Madrid, España

Re: LEER VARIAS COLUMNAS DE UNA TABLA HTML

Postby joseluisysturiz » Thu Aug 20, 2015 3:49 pm

Carlos, Navarro, buen dia...Carlos, voy a probar tu codigo y doy razon, probe el de Navarro leyendo todo el codigo html y digamos que funciono pero con un detalle, cuando se cargan las filas de la tabla al xbrowse...no se lleva todosssss los registros, ya que de una tabla que tenia 750 filas, solo se cargaron al xbrows 247, he revisado el codigo de Navarro y no veo el motivo de ese corte...el punto adicional es...que se necesita q el usuario solo coloque la direccion web donde esta la tabla en pantalla..y que el sistema..se encargue de buscar entre tanto codigo la "table" que contiene los registros, esta table se sabe el nombre, por si llegase apararecer mas tables... que codigo se usaria para saltar todo el codigo html que no tenga nada que ver con la table-? me refiero como ya puse en el codigo, a titulos, imagenes y demas cosas que hay antes de llegar a la table, espero haberme explicado. Seguire probando el codigo de navarro y ahora el tuyo, gracias pro sus apoyos, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 12 guests