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.

Foi útil?

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, '&quot;', '"',  [rfReplaceAll]);
  Result := StringReplace(Result, '&apos;', '''', [rfReplaceAll]);
  Result := StringReplace(Result, '&gt;',   '>',  [rfReplaceAll]);
  Result := StringReplace(Result, '&lt;',   '<',  [rfReplaceAll]);
  Result := StringReplace(Result, '&amp;',  '&',  [rfReplaceAll]);
  {here you may add another symbols from RFC if you need}
end;

Você pode modificar facilmente isso para fazer exatamente o que deseja.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top