Obtenha o texto renderizado da HTML (Delphi)
-
25-09-2019 - |
Pergunta
Eu tenho alguns HTML e preciso extrair o texto escrito real da página.
Até agora, tentei usar um navegador da web e renderizar a página, depois ir para a propriedade do documento e pegar o texto. Isso funciona, mas somente onde o navegador é suportado (ou seja, objeto com). O problema é que eu quero que isso também seja capaz de correr sob vinho, por isso preciso de uma solução que não use o IE com.
Deve haver uma maneira programática de fazer isso que seja razoável.
Solução
Não tenho certeza de qual é a maneira recomendada de analisar o HTML em Delphi, mas se fosse eu, eu ficaria tentado a agrupar uma cópia do html2text (seja o mais velho Programa C ++ por esse nome ou o mais novo Programa Python) e gerar um chamado para um deles.
Você pode transformar o python html2text em um executável usando py2exe. Ambos os programas HTML2Text são licenciados sob a GPL, mas desde que você apenas agrupe o executável com seu aplicativo e disponibilize a fonte deles de acordo com as restrições da GPL, você deve ficar bem.
Outras dicas
Em vez de usar um TwebBrowser, você pode usar diretamente um método TIDHTTP e seu GET.
Você recebe a string html de volta.
Aqui está uma boa rotina simples, copiado do Scalabium:
function StripHTMLTags(const strHTML: string): string;
var
P: PChar;
InTag: Boolean;
i, intResultLength: Integer;
begin
P := PChar(strHTML);
Result := '';
InTag := False;
repeat
case P^ of
'<': InTag := True;
'>': InTag := False;
#13, #10: ; {do nothing}
else
if not InTag then
begin
if (P^ in [#9, #32]) and ((P+1)^ in [#10, #13, #32, #9, '<']) then
else
Result := Result + P^;
end;
end;
Inc(P);
until (P^ = #0);
{convert system characters}
Result := StringReplace(Result, '"', '"', [rfReplaceAll]);
Result := StringReplace(Result, ''', '''', [rfReplaceAll]);
Result := StringReplace(Result, '>', '>', [rfReplaceAll]);
Result := StringReplace(Result, '<', '<', [rfReplaceAll]);
Result := StringReplace(Result, '&', '&', [rfReplaceAll]);
{here you may add another symbols from RFC if you need}
end;
Você pode modificar facilmente isso para fazer exatamente o que deseja.