ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Extrair texto de m site[RESOLVIDO]
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Ter Nov 03, 2015 6:02 pm    Assunto: Extrair texto de m site[RESOLVIDO] Responder com Citação

Olá pessoal,
estou precisando retirar um texto de um específico site.
estou testando dois métodos para fazer a extração, mas em todos estou encontrando problemas:

1° método
Código:

function TH.LerSite(ASite: string): String;
var
 WebBrowser1: TWebBrowser;
begin
WebBrowser1:= TWebBrowser.Create(nil);
 try
   if InternetCheckConnection('http://www.google.com/', 1, 0) then
    begin
     WebBrowser1.HandleNeeded;
     WebBrowser1.Visible:= False;
     WebBrowser1.Navigate(ASite);
     WebBrowser1.SendToBack;
     Application.ProcessMessages;
     try
      while (WebBrowser1.ReadyState <> READYSTATE_COMPLETE) do
      //if not WebBrowser1.OnDocumentComplete then
      begin
      Application.ProcessMessages;
      Sleep(1000);
      end;
      finally
         ResultSite:= WebBrowser1.OleObject.Document.documentElement.innerText;
      end;
    end;

 finally
 FreeAndNil(WebBrowser1);
 Application.ProcessMessages;
 end;
end;

com esse pego todo o site, depois faço a extração que preciso:
Código:

function TH.ExtractText(aText, OpenTag, CloseTag: String): String;
var
  iAux, kAux : Integer;
begin
  Result := '';

  if (Pos(CloseTag, aText) <> 0) and (Pos(OpenTag, aText) <> 0) then
  begin
    iAux := Pos(OpenTag, aText) + Length(OpenTag);
    kAux := Pos(CloseTag, aText);
    Result := Copy(aText, iAux, kAux-iAux);
  end;
  Application.ProcessMessages;
end;

Código:

function TH.LerVersiculo(AVersiculo, AFim: string): string;
var src:string;
begin
   Application.ProcessMessages;
   ResultVersiculo := ExtractText(ResultSite,AVersiculo,AFim);
   Application.ProcessMessages;
end;

e chamo assim:
Código:

S:='https://www.bibliaonline.com.br';
LerSite(S);
LerVersiculo('Versículos do Dia','Publicidade');


em sintesi crio o webbrowser e extraio texto que esta entre as tags.
mas acontece que ele tbm abre o IExplorer no site em questão, e isso não seira correto, mas não sei pq isso acontece.


2° método:
Código:

function TH.downloadSrc(var aUrl: ansiString): ansiString;
var
IdSSLIOHandler:TIdSSLIOHandlerSocketOpenSSL;
begin
try
  IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  with tIdHttp.create(nil) do begin        //Create Indy http object
   request.userAgent:=INET_USERAGENT;      //Custom user agent string
   redirectMaximum:=INET_REDIRECT_MAX;     //Maximum redirects
   handleRedirects:=INET_REDIRECT_MAX<>0;  //Handle redirects
   readTimeOut:=INET_TIMEOUT_SECS*1000;   //Read timeout msec
   IOHandler:=IdSSLIOHandler;
   try
    Application.ProcessMessages;                                      //Catch errors
    result:=get(aUrl);
    Application.ProcessMessages;                     //Do the request
    if url.port='80' then url.port:='';    //Remove port 80 from final URL
    aUrl:=url.getFullURI                   //Return final URL
   except result:='error' end;             //Return an error message if failed
   free                                    //Free the http object
  end
finally
  IdSSLIOHandler.Free;
end;
end;

Código:

function TH.RemoveTags(const s: string): string;
var
 i: Integer;
 InTag: Boolean;
 begin
  Result := '';
  InTag := False;
   for i := 1 to Length(s) do
    begin
     if s[i] = '<' then
      inTag := True
     else
     if s[i] = '>' then
      inTag := False
     else
     if not InTag then
     Result := Result + s[i];
    end;
    Application.ProcessMessages;
 end;

Código:

function TH.LerVersiculo(AVersiculo, AFim: string): string;
var src:string;
begin
   Application.ProcessMessages;
   ResultVersiculo := ExtractText(ResultSite,AVersiculo,AFim);
   src:= ResultVersiculo;
   ResultVersiculo:= RemoveTags(src);
   Application.ProcessMessages;
end;


Com o IdHHTP tbm funciona, mas ao remover as tags HTML o texto fica sem o devido espaçamento entre as frases deixando o texto todo atacado. Nesse caso tbm não sei como poderia fazer para remover as tags HTML e deixar o texto com os espaços.

Se alguém tiver uma ideia de como resolver (seria melhor se fosse com o IdHTTP).


Antecipadamente Obrigado.
Anderson.


Editado pela última vez por anderbelluno em Seg Nov 09, 2015 2:45 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
viox
Colaborador
Colaborador


Registrado: Sábado, 22 de Outubro de 2011
Mensagens: 1090
Localização: SINOP - MT

MensagemEnviada: Qua Nov 04, 2015 9:19 am    Assunto: Responder com Citação

Olá amigos não conheço nenhum método dessa classe que possua tal função mas você pode fazer o seguinte...

Incremente seu método RemoveTags para verificar o ultimo carácter que está sendo adicionado no Result, se for . , ! ? e o que mais você imaginar bastar dar um espaço...
_________________
Just another Delphi guy.


http://www.soft42.com
http://www.nortaonegocios.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
matteusin
Aprendiz
Aprendiz


Registrado: Terça-Feira, 28 de Fevereiro de 2012
Mensagens: 156

MensagemEnviada: Qua Nov 04, 2015 10:46 am    Assunto: Responder com Citação

Boa tarde!
Montei aqui um exemplo com o idHTTP! Percebi que são informados 2 versículos, eu fiz pra pegar apenas um, mas se precisar dos dois, é fácil adaptar.

Outra coisa, eu usei o Indy 9 do Delphi 7 pq fiz correndo aqui na empresa onde trabalho, mas tbm acredito que seja simples a troca.

Segue o código:
Código:
function ExtractText(aText, OpenTag, CloseTag : String) : String;
var
  iAux, kAux : Integer;
begin
  Result := '';

  if (Pos(CloseTag, aText) <> 0) and (Pos(OpenTag, aText) <> 0) then
  begin
    iAux := Pos(OpenTag, aText) + Length(OpenTag);
    kAux := Pos(CloseTag, aText);
    Result := Copy(aText, iAux, kAux-iAux);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var HTTP: TIdHTTP;
    SSLIOHandlerSocket: TIdSSLIOHandlerSocket;
    xSource, xVersiculo: String;
begin

  HTTP := TIdHTTP.Create(nil);
  SSLIOHandlerSocket:= TIdSSLIOHandlerSocket.Create(Nil);

  SSLIOHandlerSocket.SSLOptions.Method:= sslvTLSv1;
  SSLIOHandlerSocket.SSLOptions.Mode:= sslmUnassigned;
  HTTP.IOHandler:= SSLIOHandlerSocket;

  HTTP.Request.Accept := 'text/html, */*';
  HTTP.Request.UserAgent := 'Mozilla/3.0 (compatible; IndyLibrary)';
  HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  HTTP.HandleRedirects := True;
  xSource:= UTF8Decode(HTTP.Get('https://www.bibliaonline.com.br/'));

  xSource:= Copy(xSource, Pos('Versículos do Dia', xSource), Length(xSource) );

  xVersiculo:= ExtractText(xSource, '">', '</span>');
  xSource:= Copy(xSource, Pos('</span>', xSource), Length(xSource));
  xVersiculo:= xVersiculo+#13#10+'- '+ExtractText(xSource, '">', '</a>');

  HTTP.Free;
  SSLIOHandlerSocket.Free;

  Memo1.Text := xVersiculo;

end;


Resultado:



Obs: As tags de localização do html que utilizei acho que são fixas.

Boa sorte!
_________________
Visite meu blog: http://devsistem.blogspot.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Qua Nov 04, 2015 1:05 pm    Assunto: Responder com Citação

viox e matteusin,
obrigado por ajudar, assim que chegar em casa vou testar e posto o resultado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Qua Nov 04, 2015 5:49 pm    Assunto: Responder com Citação

E ai matteusin
seguinte, fiz aqui como vc descreveu, tive que alterar o TIdSSLIOHandlerSocket para TIdSSLIOHandlerSocketOpenSSL por questão de compatibilidade.
E foi a única coisa que fiz de diferente, ai me deu Connetion timeout no HTTP, coloque o HTTP.ConnetionTimeOut:= 3000, mas mesmo assim continua dando o mesmo erro.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Sex Nov 06, 2015 1:56 pm    Assunto: Responder com Citação

Ainda não consegui fazer com o IdHTTP, e se fosse possível gostaria de extrair os 2 versículos como disse o amigo matteusin.
tava esquecendo uso o Delphi2010.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Nov 06, 2015 2:42 pm    Assunto: Responder com Citação

Testei o código e após algumas modificações funcionou normalmente, extraindo primeiro versículo:

Código:
var
  HTTP: TIdHTTP;
  SSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
  xSource, xVersiculo: String;
begin
  HTTP := TIdHTTP.Create(nil);
  SSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Nil);

  SSLIOHandlerSocket.SSLOptions.Method := sslvTLSv1;
  SSLIOHandlerSocket.SSLOptions.Mode := sslmUnassigned;
  HTTP.IOHandler := SSLIOHandlerSocket;

  HTTP.Request.Accept := 'text/html, */*';
  HTTP.Request.UserAgent := 'Mozilla/3.0 (compatible; IndyLibrary)';
  HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  HTTP.HandleRedirects := True;
  xSource := HTTP.Get('https://www.bibliaonline.com.br/');

  xSource := Copy(xSource, Pos('Versículos do Dia', xSource), Length(xSource));

  xVersiculo := ExtractText(xSource, '">', '</span>');
  xSource := Copy(xSource, Pos('</span>', xSource), Length(xSource));
  xVersiculo := xVersiculo + #13#10 + '- ' + ExtractText(xSource, '">', '</a>');

  HTTP.Free;
  SSLIOHandlerSocket.Free;

  Memo1.Text := xVersiculo;
end;


Testado com Delphi XE5 e Indy 10
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Sex Nov 06, 2015 3:44 pm    Assunto: Responder com Citação

Segue código completo, extraindo os 2 versículos:

- Adicione IdHttp, IdSSLOpenSSL na uses do form.

Código:
function ExtractText(aText, OpenTag, CloseTag: String): String;
var
  iAux, kAux: Integer;
begin
  Result := '';

  if (Pos(CloseTag, aText) <> 0) and (Pos(OpenTag, aText) <> 0) then
  begin
    iAux := Pos(OpenTag, aText) + Length(OpenTag);
    kAux := Pos(CloseTag, aText);
    Result := Copy(aText, iAux, kAux - iAux);
  end;
end;

function RemoveTags(const s: string): string;
var
 i: Integer;
 InTag: Boolean;
 begin
  Result := '';
  InTag := False;
   for i := 1 to Length(s) do
    begin
     if s[i] = '<' then
      inTag := True
     else
     if s[i] = '>' then
      inTag := False
     else
     if not InTag then
     Result := Result + s[i];
    end;
    Application.ProcessMessages;
 end;


Código:
procedure TForm7.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
  SSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
  xSource, xVersiculo1, xVersiculo2: String;
begin
  HTTP := TIdHTTP.Create(nil);
  SSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Nil);

  SSLIOHandlerSocket.SSLOptions.Method := sslvTLSv1;
  SSLIOHandlerSocket.SSLOptions.Mode := sslmUnassigned;
  HTTP.IOHandler := SSLIOHandlerSocket;

  HTTP.Request.Accept := 'text/html, */*';
  HTTP.Request.UserAgent := 'Mozilla/3.0 (compatible; IndyLibrary)';
  HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
  HTTP.HandleRedirects := True;
  xSource := HTTP.Get('https://www.bibliaonline.com.br/');

  xSource := Copy(xSource, Pos('Versículos do Dia', xSource), Length(xSource));

  xVersiculo1:=  ExtractText(xSource, '<p>', '</p>');
  xVersiculo1:= RemoveTags(xVersiculo1);

  xSource := Copy(xSource, Pos('</p>', xSource) + 4, Length(xSource));

  xVersiculo2:=  ExtractText(xSource, '<p>', '</p>');
  xVersiculo2:= RemoveTags(xVersiculo2);

  HTTP.Free;
  SSLIOHandlerSocket.Free;

  Memo1.Clear;
  Memo1.Lines.Add('Versículo 1: ' + #13#10+ xVersiculo1 +#13#10);
  Memo1.Lines.Add(' ');
  Memo1.Lines.Add('Versículo 2: '  + #13#10+ xVersiculo2 +#13#10);
end;


Link do exemplo acima:
http://www.4shared.com/zip/ys8PM6zrba/Versculo.html
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Sex Nov 06, 2015 6:13 pm    Assunto: Responder com Citação

E ai natanbh1, nesse ponto creio que seje um problema com a indy, pq continua da dar erro de Connection TimeOut. vou ver se existe atualizaçao pra ver se resolve.
Obrigado por enquanto pela força.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Sáb Nov 07, 2015 3:02 pm    Assunto: Responder com Citação

natanbh1,
minha indy tbm é a 10 com delphi 2010.
pq será que continua dando erro de timeout?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
matteusin
Aprendiz
Aprendiz


Registrado: Terça-Feira, 28 de Fevereiro de 2012
Mensagens: 156

MensagemEnviada: Seg Nov 09, 2015 6:47 am    Assunto: Responder com Citação

anderbelluno escreveu:
natanbh1,
minha indy tbm é a 10 com delphi 2010.
pq será que continua dando erro de timeout?


Bom dia! Pode ser talvez a versão das suas Dlls? Tenta uma versão mais atualizada
_________________
Visite meu blog: http://devsistem.blogspot.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Seg Nov 09, 2015 12:19 pm    Assunto: Responder com Citação

matteusin escreveu:

Bom dia! Pode ser talvez a versão das suas Dlls? Tenta uma versão mais atualizada


E ai matteusin,
blz?
seguinte atualizei as dll's openssl, as quais possuem a versão 1.0.2d, mas infelizmente continua o bendito erro de timeout. gostaria muito de resolver esse problema.

Uso a indy para enviar e-mails sem problemas, não sei se tem algo em comum, mas funciona normalmente.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Seg Nov 09, 2015 1:01 pm    Assunto: Responder com Citação

Baixou o projeto exemplo que postei e testou?
http://www.4shared.com/zip/ys8PM6zrba/Versculo.html

Você está criando os componentes (IdHTTP e IdSSLIOHandlerSocketOpenSSL) em tempo de projeto (palheta) ou em runtime, como nos exemplos que passamos?

Verifique se você está dando o Get no site com https.

Errado (http):
Código:
xSource := HTTP.Get('http://www.bibliaonline.com.br/');


Certo (https):
Código:
xSource := HTTP.Get('https://www.bibliaonline.com.br/');

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
anderbelluno
Colaborador
Colaborador


Registrado: Quarta-Feira, 23 de Novembro de 2011
Mensagens: 1030
Localização: Cianorte-PR

MensagemEnviada: Seg Nov 09, 2015 2:05 pm    Assunto: Responder com Citação

natanbh1 escreveu:
Baixou o projeto exemplo que postei e testou?
http://www.4shared.com/zip/ys8PM6zrba/Versculo.html

Você está criando os componentes (IdHTTP e IdSSLIOHandlerSocketOpenSSL) em tempo de projeto (palheta) ou em runtime, como nos exemplos que passamos?

Verifique se você está dando o Get no site com https.

Errado (http):
Código:
xSource := HTTP.Get('http://www.bibliaonline.com.br/');


Certo (https):
Código:
xSource := HTTP.Get('https://www.bibliaonline.com.br/');


Opa, baixei sim e deu o mesmo erro de timeout.
estou criando em Runtime pq esta em uma thread.
verifiquei tbm o http.get, e esta da maneira correta como vc informou, com o https...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Seg Nov 09, 2015 2:26 pm    Assunto: Responder com Citação

Utiliza Proxy?

Desabilitou Firewall e Antivírus para teste?
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB