Página 1 de 1

Converter HTML para Texto

Enviado: 03 Fev 2012 10:15
por asimoes
Pessoal,

Como não achei nada na internet e falta de tempo mesmo, acabei criando uma função para isso:

Qualquer sugestão fiquem a vontade para melhorar a função, a principio está me atendendo.

Uso: Html2Texto(cArquivo)

Código: Selecionar todos

FUNCTION Html2Texto(cArq)
LOCAL cTexto:="", cLinha:="", nLinha, nPosIni, nPosFim, cChar

   FT_FUSE( cArq )
   DO WHILE !FT_FEOF()
      cLinha:=FT_FREADLN()
      cLinha:=StrTran( cLinha, Chr(12)) // Elimina caracter EJECT
      cLinha:=StrTran( cLinha, Chr(13))
      FOR nLinha:=1 TO Len(cLinha)
         nPosIni:=At('<', cLinha)
         nPosFim:=At('>', cLinha)
         cChar:=SubStr(cLinha,nPosIni,nPosFim)
         cLinha:=StrTran(cLinha,cChar)
         //? cLinha, nPosIni, nPosFim  
         //inkey(0)
         IF nPosIni == 0 .AND. nPosFim == 0
            EXIT
         ENDIF
      NEXT
      cTexto+=cLinha
      FT_FSKIP()
   ENDDO
   FT_FUSE()
//HTML exemplo:
/*<html>
<body>
<center><b><font color="#0000FF">Email enviado com sucesso</font></b></center>
</body>
</html>*/
RETURN cTexto

Converter HTML para Texto

Enviado: 03 Fev 2012 13:57
por Pablo César
Parece haver algum erro, não está retornando corretamente o conteúdo até o final de arquivo. Vou verificar mais tarde e posto o resultado. O uso das funções FT_* tinham um bug, que foi consertado, não sei ao certo ainda se é isso. Mas vou ver mais tarde...

Converter HTML para Texto

Enviado: 03 Fev 2012 15:20
por Pablo César
Na sua função, de interpretar linha a linha, falta elaborar mais fim de interpretar por exemplo:

- As tags  <br /> <br />  para desdobrar as quebras de linhas do próprio texto do html.
- As macros do próprio php  &?acute;  os  ç  para transformar em acentos, c cedilhas do texto do html

Enfim um série de tags que podem compor um html.

Na minha opinião, a utilização da função oActiveX:ExecWB() que marca e copia para a área de transferência é mais fácil de obter o mesmo ou quase o mesmo resultado. Exemplo dessa utilização eu faço no módulo WebGets.prg do Aplicativo para alterar data e hora na inicialização-Windows onde capturo a tela, copio na área de transferência e leio em forma de string o seu conteúdo em texto.

Converter HTML para Texto

Enviado: 03 Fev 2012 16:01
por asimoes
Olá Pablo,

Se você olhar no final da função tem um exemplo de html que é o objeto do meu problema.
A função já funcionou comigo usando as funções FT* e tudo que está entre < > inclusive é eliminado do texto.
ficando somente o texto do exemplo: Email enviado com sucesso
A função que eu fiz não é solução definitiva, pode ser melhorada.

*/<html>
<body>
<center><b><font color="#0000FF">Email enviado com sucesso</font></b></center>
</body>
</html>*/

Converter HTML para Texto

Enviado: 03 Fev 2012 16:30
por Pablo César
Pois é... pra mim não deu muito certo não. Gravei esta página deste tópico em htm e quis ver o resultado mas abortou quando encontrou o primeiro tag  <head> 

Converter HTML para Texto

Enviado: 03 Fev 2012 17:17
por asimoes
Pablo,

Eu estou usando o harbour baixado pelo svn.

Meu programa de teste que funcionou. ou melhor está funcionando. acabei de testar.

Código: Selecionar todos

FUNCTION MAIN
CLS
IF Inetestaconectada()=.F.
   alert("para testar essa função você deve ter acesso a internet, favor vereficar")
   RETURN Nil
ENDIF
Consulta()
RETURN Nil

FUNCTION Consulta
LOCAL oPg  :=Win_OleCreateObject("Microsoft.XMLHTTP")
oPg:Open("GET",'http://xxxxxxx.xxx.xx.xxx.br/cgi-bin/EnviaEmail_CGI.exe?Nome=Teste&Assunto=Teste de email Harbour&Destinos=[]Equipe03&CC=[]Equipe07&BCC=asimoesluz@gmail.com&ResponderPara=&Origem=hhelpdes@smf.com&EhErro=F&Html=F&Corpo="Testando envio de email com o Harbour"')
oPg:Send()
DelayResposta(3)
cBuf:=oPg:responseText
IF File("resposta.txt")
   FErase("resposta.txt")
ENDIF

EscreveLinha(cBuf,"resposta.txt")

cResposta:=Html2Texto("resposta.txt")

IF Empty(cResposta)
   alert("Email não enviado.")
ELSE
   alert(cResposta)
ENDIF
quit

RETURN Nil

FUNCTION DelayResposta(nDelay)
FOR I:=1 TO nDelay
   Inkey(1)
NEXT
RETURN Nil


FUNCTION Html2Texto(cArq)
LOCAL cTexto:="", cLinha:="", nLinha, nPosIni, nPosFim, cChar

   FT_FUSE( cArq )
   DO WHILE !FT_FEOF()
      cLinha:=FT_FREADLN()
      cLinha:=StrTran( cLinha, Chr(12)) // Elimina caracter EJECT
      cLinha:=StrTran( cLinha, Chr(13))
      FOR nLinha:=1 TO Len(cLinha)
         nPosIni:=At('<', cLinha)
         nPosFim:=At('>', cLinha)
         cChar:=SubStr(cLinha,nPosIni,nPosFim)
         cLinha:=StrTran(cLinha,cChar)
         //? cLinha, nPosIni, nPosFim  
         //inkey(0)
         IF nPosIni == 0 .AND. nPosFim == 0
            EXIT
         ENDIF
      NEXT
      cTexto+=cLinha
      FT_FSKIP()
   ENDDO
   FT_FUSE()
/*<html>
<body>
<center><b><font color="#0000FF">Email enviado com sucesso</font></b></center>
</body>
</html>*/
RETURN cTexto

FUNCTION inetestaconectada( cAddress )
LOCAL aHosts, cName
InetInit()
IF cAddress == NIL
   cAddress := "www.google.com.br"
ENDIF
aHosts := InetGetHosts( cAddress )
IF aHosts == NIL .OR. Len(aHosts)=0
   InetCleanup()
   RETURN .F.
ENDIF
InetCleanup()
RETURN .T.

FUNCTION AbreLinha(nLinha,cArq)
LOCAL I
DEFAULT nLinha TO 1
   FOR I:=1 TO nLinha
      StrFile(""+HB_OsNewLine(),cArq,.T.)
   NEXT
RETURN Nil

FUNCTION EscreveLinha(cVar,cArq)
   StrFile(cVar,cArq,.T.)
RETURN Nil

Converter HTML para Texto

Enviado: 03 Fev 2012 19:24
por asimoes
Pablo,

Vi que você está usando activex, tem como adaptar pro exemplo que postei?

Converter HTML para Texto

Enviado: 05 Fev 2012 13:44
por Pablo César
Mas a questão que teria que exibir a página, posicionar-se e aí capturar, entendeu ? Seria o caso diferente do que você fez. Pois deveria baixar página, não sei se daria de copiar sem exibir...

Converter HTML para Texto

Enviado: 05 Fev 2012 20:10
por rochinha
Amiguinhos,

Voces poderia tentar com esta função:

Código: Selecionar todos

FUNCTION CleanHTML( cfile )
    LOCAL oExplorer := TOLEAuto():New( "InternetExplorer.Application" ) 
    oExplorer:Navigate2( cfile ) 
    DO WHILE oExplorer:ReadyState <> 4 
       HB_IDLESLEEP( 1 ) 
    ENDDO
    cINNText := oExplorer:Document:Body:InnerText 
    MemoWrit( "t.txt", cINNText )
    MemoEdit( MemoRead( "t.txt" ) )
    oExplorer:Quit() 
    RETURN NIL
Passando no parametro o URL.

Converter HTML para Texto

Enviado: 06 Fev 2012 10:13
por rochinha
Amiguinhos,

Por favor me informem qual a biblioteca do HARBOUR que possui as funções FT_*.

Tenho uma porrada de bibliotecas e duzentas versões de Harbour aqui mas não encontrei.

Obrigado.

Converter HTML para Texto

Enviado: 06 Fev 2012 11:55
por Pablo César
Por favor me informem qual a biblioteca do HARBOUR que possui as funções FT_*.
É da contrib hbnf Rochinha.

Converter HTML para Texto

Enviado: 06 Fev 2012 11:59
por rochinha
Amiguinho,

Valeu, vou acrescenta-la agora, apesar de ter olhado internamente a procura das funções.

Converter HTML para Texto

Enviado: 06 Fev 2012 14:00
por asimoes
Olá Rochinha,

O seu exemplo funcionou perfeitamente.
A biblioteca ft* é a hbnf

Converter HTML para Texto

Enviado: 05 Set 2018 14:54
por clodoaldomonteiro
Boa tarde,

Retomando esse tópico, pergunto se tem como pegarmos um HTML e transformarmos em Dados, como por exemplo, separado por vírgula .CSV?