Página 1 de 1

Importar dados de um HTML e gravar em DBF

Enviado: 27 Jun 2013 15:56
por trooper7
Olá amigos, boa tarde!

Gostaria de saber a melhor maneira de pegar os dados existentes nesta tabela HTML: http://201.16.219.99/relatorio.html e gravá-los em um arquivo DBF, com os determinados campos da tabela. Notei que através da função FOPEN() eu consigo abrir o arquivo para trabalhar em cima dele, mas após isso não sei bem como proceder.

Agradeço desde já pela ajuda e atenção.

Abraços!

Importar dados de um HTML e gravar em DBF

Enviado: 28 Jun 2013 02:42
por rochinha
Amiguinho,

Veja se este aplicativo te ajuda em algo.

Importar dados de um HTML e gravar em DBF

Enviado: 28 Jun 2013 07:34
por trooper7
Bom dia, amigo!

Dei uma olhada e acredito que a manipulação do arquivo HTML que este programa faz seja mais ou menos o que eu preciso. Existe a codificação dele pare que eu dê uma olhada?
Preciso varrer o arquivo buscando os atributos "<td>" e "</td>" para localizar os conteúdos e gravá-los em uma variável temporária, por exemplo.
Assim, no final do laço, eu gravaria estes conteúdos em um arquivo DBF. Só estou me embanando em como fazer esta varredura.

Mas de qualquer forma, obrigado pela dica.

Abraços

Importar dados de um HTML e gravar em DBF

Enviado: 28 Jun 2013 12:21
por rochinha
Amiguinho,

Dê uma olhada neste tópico aqui

Este forum é uma verdadeira biblioteca xBase.

Importar dados de um HTML e gravar em DBF

Enviado: 28 Jun 2013 12:55
por Jairo Maia
Olá,

Dentro do raciocínio de ler por tags como mencionado pelo rochinha, adaptei um exemplo a sua tabela, veja se ajuda.

Nota: O que não sei é se o Clipper pode ler nomes de arquivos diferentes de 8x3. Testei o exemplo em Harbour, se não conseguir ler o arquivo com nome longo: Relatorio.html, faça o ajuste do exemplo.

Espero ter ajudado.

Importar dados de um HTML e gravar em DBF

Enviado: 02 Jul 2013 08:13
por trooper7
Bom dia, amigos!

rochinha, muito obrigado pela ajuda! Dei uma olhada no tópico sobre xBase e consegui ter uma boa noção agora.

E Jairo, obrigado ainda mais pela contribuição! A partir deste código, acho que consigo alguma coisa...
Estranho que compilei o mesmo, tanto no xHarbour quanto no Harbour 3.0, e não consegui puxar os dados. Ele cria o arquivo DBF com os campos corretos, mas não puxa os dados. O que pode ser? Troquei o nome do arquivo HTML para "rela.html", por exemplo, como você sugeriu, mas mesmo assim não deu.
Tentei então apenas mostrar os dados na tela, mas ele não mostra nada, o que me parece ser um problema na puxada dos dados mesmo...
Enfim, vou continuar fuçando por aqui.

EDIT*

Jairo, consegui fazer a importação dos dados para o DBF. Porém, em uma tabela com apenas 4 linhas, estão vindo 11 registros, sendo que alguns campos não estão sendo puxados.
Segue o código depois de algumas alterações minhas:

Código: Selecionar todos

function main()

n := 0
flinha := chr(10) //estou usando pelo linux

arq := "teste.html"
x1 := FOpen( arq, 2 )

if ferror() != 0
    alert("ERRO! Nao foi possivel abrir: " + arq )
    quit
else
    if !file( "relatorio.dbf" )
        xestru := {;
                  {"Sacado"     ,"C", 50, 0},;
                  {"Ocorrencia" ,"C", 30, 0},;
                  {"NTitulo"    ,"C", 10, 0},;
                  {"Tp"         ,"C", 10, 0},;
                  {"Bord_Ord"   ,"C", 15, 0},;
                  {"DtVencto"   ,"D",  8, 0},;
                  {"DtBaixa"    ,"D",  8, 0},;
                  {"Valor"      ,"N", 10, 2},;
                  {"Desconto"   ,"N", 10, 2},;
                  {"Juros"      ,"N", 10, 2},;
                  {"Total"      ,"N", 10, 2};
                  }
        dbcreate("relatorio", xestru)
    endif

    USE relatorio EXCLUSIVE NEW

    // Zap
endif



do while .t.

    cBuffer := space(2048)    // le 2048 bytes de cada vez
    fseek( x1, n, 1 )        // posiciona o pointer para leitura

    nLido := fread( x1 , @cBuffer, 2048 )

    nEol := at(flinha,cBuffer)
    if nEol <= 0                  // fim de arquivo
        exit
    else
        cBuffer := upper(cBuffer)  // coloca o q foi lido em maisculo
    endif


    do while ( "TR BGCOLOR" $ cBuffer ) .and. ( "</TR>" $ cBuffer )   // uma linha da tabela
        
        nIni := at( "TR BGCOLOR", cBuffer )
        nFim := at( "</TR>", cBuffer )
        cBloco := substr( cBuffer, nIni, nFim )  // pega um bloco
        nLinhas := MLCount( cBloco )

        nCampo := 0
        
        for lin = 1 to nLinhas
   
            cLinha := alltrim(memoline( cBloco, 255, lin+1 ))

            if ( "</TR>" $ cLinha )  // fim de bloco
                exit
            elseif ( "</TD>" $ cLinha )     //.and. ( ")  // se for linha de dados...
                if nCampo = 0
                    APPEND BLANK
                endif
    
                nIni := at( '>', cLinha )
                nFim := at( "</TD>", cLinha )
    
                cDados := substr( cLinha, nIni+1, nFim - 1 )
                @ 09,00 say "CONTEUDO: "+cDados
                inkey(0)
                cDados := strtran( cDados, "</TD>" )
                @ 10,00 say "DEPOIS CONTEUDO: "+cDados
                inkey(0)
                
    
                nCampo++
                cCampo := field( nCampo )
    
                do case
                   case ValType( &cCampo. ) = "C"
                        replace &cCampo. with cDados
                        @ 11,00 say "TIPO: CARACTERE"
                        inkey(0)
                        
    
                    case ValType( &cCampo. ) = "D"
                        replace &cCampo. with ctod(cDados)
                        @ 11,00 say "TIPO: DATA"
                        inkey(0)                        
        
                    case ValType( &cCampo. ) = "N"
                        replace &cCampo. with val(cDados)
                        @ 11,00 say "TIPO: NUMERICO"
                        inkey(0)
                endcase
                cls
            endif

        next

        cBuffer := strtran( cBuffer, cBloco )  // remove o bloco processado

    enddo

    n -= Len( cBuffer )  // acerta o Pointer

enddo
A tabela que estou usando para importar é exatamente essa:

Código: Selecionar todos

<table id="zoomA" border="0" width="870px" align="center" style="font-Size: 10px">
    <tbody>
        <tr>
            <td width="180" class="tit_table">Sacado</td>
            <td width="140" class="tit_table">Ocorrência</td>
            <td width="60" class="tit_table">NºTit.</td>
            <td width="60" class="tit_table">TP</td>

            <td width="30" class="tit_table">Bord./Ord.</td>

            <td width="50" class="tit_table">Dt.Vencto</td>
            <td width="50" class="tit_table">Dt.Baixa</td>
            <td width="50" class="tit_table">Valor</td>
            <td width="30" class="tit_table">Desc.</td>
            <td width="40" class="tit_table">Juros</td>
            <td width="45" class="tit_table">Total</td>
        </tr>

        <tr bgcolor="#E8E8E8">
            <td align="left">NOME DE CLIENTE NUMERO 1 </td>
            <td align="left">01-Pagamento em dia</td>
            <td align="center">008544-5</td>
            <td align="center" title="Convencional - Duplicata">CV-DP</td>

            <td align="left">136063/20</td>

            <td align="center">06/06/2013</td>
            <td align="center">07/06/2013</td>
            <td align="right">974,85</td>
            <td align="right">0,00</td>
            <td align="right">0,00</td>
            <td align="right">974,85</td>
        </tr>

        <tr bgcolor="#F2F2F2">
            <td align="left">NOME DE CLIENTE NUMERO 2 </td>
            <td align="left">01-Pagamento em dia</td>
            <td align="center">066734-1</td>
            <td align="center" title="Convencional - Duplicata">CV-DP</td>

            <td align="left">136709/136</td>

            <td align="center">06/06/2013</td>
            <td align="center">07/06/2013</td>
            <td align="right">22196,26</td>
            <td align="right">0,00</td>
            <td align="right">0,00</td>
            <td align="right">22196,26</td>
          </tr>

        <tr bgcolor="#E8E8E8">
            <td align="left">NOME DE CLIENTE NUMERO 3 </td>
            <td align="left">01-Pagamento em dia</td>
            <td align="center">008544-5</td>
            <td align="center" title="Convencional - Duplicata">CV-DP</td>

            <td align="left">412444/20</td>

            <td align="center">26/06/2013</td>
            <td align="center">17/06/2013</td>
            <td align="right">12334,85</td>
            <td align="right">0,00</td>
            <td align="right">0,00</td>
            <td align="right">33224,85</td>
        </tr>

        <tr bgcolor="#F2F2F2">
            <td align="left">NOME DE CLIENTE NUMERO 4 </td>
            <td align="left">01-Pagamento em dia</td>
            <td align="center">066734-1</td>
            <td align="center" title="Convencional - Duplicata">CV-DP</td>

            <td align="left">16778869/136</td>

            <td align="center">13/06/2013</td>
            <td align="center">23/06/2013</td>
            <td align="right">9292,26</td>
            <td align="right">0,00</td>
            <td align="right">0,00</td>
            <td align="right">22236,26</td>
          </tr>


        <tr>
          <td align="left" colspan="7"><b>Subtotal:</b></td>
          <td align="right" style="border-top: 1px solid #000">244.019,17</td>
          <td align="right" style="border-top: 1px solid #000">0,00</td>
          <td align="right" style="border-top: 1px solid #000">462,49</td>
          <td align="right" style="border-top: 1px solid #000">244.481,66</td>
        </tr>
      </tbody>
</table>
Não consigo ver o que pode estar errado...

De qualquer forma, obrigado mais uma vez.

Abraços!

Importar dados de um HTML e gravar em DBF

Enviado: 02 Jul 2013 19:30
por Jairo Maia
Olá,

Realmente o exemplo não estava funcionando. Refiz o exemplo e testei, e agora está funcionando. Dê uma olhada que agora acho que vai.

Nota: Usei meu exemplo anterior e testei em Windows. Assim, faça os ajustes para o Linux, ok?

Importar dados de um HTML e gravar em DBF

Enviado: 03 Jul 2013 10:49
por trooper7
Maravilha, Jairo! Agora está 100%!
Fiz as alterações necessárias e adaptei ao meu programa, está tudo funcionando!
Muito obrigado pela atenção e pela ajuda!

Grande abraço!