Получить отрендеренный текст из HTML (Delphi) - PullRequest
4 голосов
/ 09 июня 2010

У меня есть немного HTML, и мне нужно извлечь фактический письменный текст со страницы.

До сих пор я пытался использовать веб-браузер и отображать страницу, затем перейти к свойству документа и получить текст. Это работает, но только там, где поддерживается браузер (объект IE com). Проблема в том, что я хочу, чтобы это тоже можно было запускать под Wine, поэтому мне нужно решение, которое не использует IE COM.

Должен быть программный способ сделать это разумным.

Ответы [ 3 ]

4 голосов
/ 09 июня 2010

Я не уверен, каков рекомендуемый способ парсинга HTML в Delphi, но если бы это был я, я бы соблазнился просто связать копию html2text (либо более старую C ++ программу от это имя или более новая программа Python ) и вызовет один из них.

Вы можете превратить Python html2text в исполняемый файл, используя py2exe . Обе программы html2text лицензируются по лицензии GPL, но если вы просто связываете их исполняемый файл с приложением и делаете их источник доступным в соответствии с ограничениями GPL, то с вами должно быть все в порядке.

1 голос
/ 09 июня 2010

Вот хорошая простая процедура, скопированная из 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;

Затем вы можете легко изменить это, чтобы сделать именно то, что вы хотите.

1 голос
/ 09 июня 2010

Вместо использования TWebBrowser вы можете напрямую использовать TIdHttp и его метод Get.
Вы возвращаете строку html.

...