Получить визуализированный текст из HTML (Delphi)

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

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

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


person Daisetsu    schedule 08.06.2010    source источник


Ответы (3)


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

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

person Josh Kelley    schedule 08.06.2010
comment
Один из браузеров текстового режима (например, lynx/links/w3c) также может делать это (в iirc есть параметр --dump для этого с afaik w3c), и у них, вероятно, где-то есть версии mingw. Или, по крайней мере, они есть в cygwin - person Marco van de Voort; 09.06.2010

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

person Francesca    schedule 08.06.2010
comment
Это базовый HTML, а не отображаемый текст. Визуализированный означает текст, который человек мог бы прочитать, если бы он или она посмотрели на веб-браузер, отображающий страницу на экране. - person Rob Kennedy; 09.06.2010
comment
Ох, хорошо. Я думал, что ОП хотел получить html без необходимости использования IE. Хотя это будет первый шаг. ... и да, я должен читать внимательнее ;-) - person Francesca; 09.06.2010
comment
В сочетании с StripHTMLTags (@lkessler) это становится хорошим вариантом. - person Chris Thornton; 09.06.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;

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

person lkessler    schedule 08.06.2010