从HTML获取呈现的文本( Delphi )

7y4bm7vi  于 2023-01-17  发布在  其他
关注(0)|答案(4)|浏览(172)

我有一些HTML,我需要从页面中提取实际的书面文本。
到目前为止,我已经尝试使用网络浏览器和渲染页面,然后转到文档属性和抓取文本。这工作,但只有在浏览器支持(IE COM对象)。问题是我希望它能够运行在葡萄酒下也,所以我需要一个解决方案,不使用IE COM。
必须有一个合理的程序化方法来实现这一点。

7hiiyaii

7hiiyaii1#

我不确定在 Delphi 中解析HTML的推荐方法是什么,但如果是我,我会尝试捆绑一个html2text的副本(或者是同名的旧C++ program,或者是较新的Python program),并生成对其中一个的调用。
你可以使用py2exe将Python html2text转换为可执行文件。这两个html2text程序都是根据GPL授权的,但只要你将它们的可执行文件与应用捆绑在一起,并根据GPL的限制提供它们的源代码,那么你应该没问题。

72qzrwbm

72qzrwbm2#

您可以直接使用TIdHttp及其Get方法,而不是使用TWebBrowser。
你得到html字符串回来。

9lowa7mx

9lowa7mx3#

下面是一个很好的简单例程copied from 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;

然后,您可以轻松地修改它,以完全按照您的需要进行操作。

cyej8jka

cyej8jka4#

对以前用于创建多行文字的函数进行了轻微增强

function StripHTMLTags(strHTML: string): string;
const crlf='&crlf;';
var
  P: PChar;
  InTag: Boolean;
  i, intResultLength: Integer;

begin
  strHTML:=StringReplace(strHTML, '<br/>',crlf,[rfReplaceAll, rfIgnoreCase]);
  strHTML:=StringReplace(strHTML, '</div>',crlf,[rfReplaceAll, rfIgnoreCase]);
  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]);
  Result := StringReplace(Result, crlf,  #13#10,  [rfReplaceAll]);

end;

相关问题