从 HTML 获取渲染文本 (Delphi)

发布于 2024-09-05 08:39:06 字数 183 浏览 8 评论 0原文

我有一些 HTML,我需要从页面中提取实际的书面文本。

到目前为止,我已经尝试使用网络浏览器并渲染页面,然后转到文档属性并抓取文本。这有效,但仅在支持浏览器的情况下(IE com 对象)。问题是我希望它也能够在 wine 下运行,所以我需要一个不使用 IE COM 的解决方案。

必须有一种合理的程序化方法来做到这一点。

I have some HTML and I need to extract the actual written text from the page.

So far I have tried using a web browser and rendering the page, then going to the document property and grabbing the text. This works, but only where the browser is supported (IE com object). The problem is I want this to be able to run under wine also, so I need a solution that doesn't use IE COM.

There must be a programatic way to do this that is reasonable.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

榆西 2024-09-12 08:39:06

我不确定在 Delphi 中解析 HTML 的推荐方法是什么,但如果是我,我会很想捆绑 html2text 的副本(旧的 C++ 程序 使用该名称或较新的 Python 程序)并生成对其中之一的调用。

您可以使用 py2exe 将 Python html2text 转换为可执行文件。这两个 html2text 程序都是根据 GPL 获得许可的,但只要您只是将它们的可执行文件与您的应用程序捆绑在一起,并根据 GPL 的限制提供它们的源代码,那么您应该没问题。

I'm not sure what the recommended way of parsing HTML in Delphi is, but if it were me, I'd be tempted to just bundle a copy of html2text (either the older C++ program by that name or the newer Python program) and spawn a call to one of those.

You can turn the Python html2text into an executable using py2exe. Both html2text programs are licensed under the GPL, but as long as you merely bundle their executable with your app and make their source available according to the GPL's restrictions, then you ought to be okay.

隱形的亼 2024-09-12 08:39:06

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

Instead of using a TWebBrowser, you can directly use a TIdHttp and its Get method.
You get the html string back.

酒浓于脸红 2024-09-12 08:39:06

这是一个很好的简单例程,从 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;

然后您可以轻松修改它以执行以下 操作:正是您想要的。

Here's a nice simple routine, 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, '"', '"',  [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;

You can then easily modify this to do exactly what you want.

九八野马 2024-09-12 08:39:06

稍微增强了之前创建多行文本的功能

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, '"', '"',  [rfReplaceAll]);
  Result := StringReplace(Result, ''', '''', [rfReplaceAll]);
  Result := StringReplace(Result, '>',   '>',  [rfReplaceAll]);
  Result := StringReplace(Result, '<',   '<',  [rfReplaceAll]);
  Result := StringReplace(Result, '&',  '&',  [rfReplaceAll]);
  Result := StringReplace(Result, crlf,  #13#10,  [rfReplaceAll]);

end;

Slight enhancement of the previous function for creating multiline text

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, '"', '"',  [rfReplaceAll]);
  Result := StringReplace(Result, ''', '''', [rfReplaceAll]);
  Result := StringReplace(Result, '>',   '>',  [rfReplaceAll]);
  Result := StringReplace(Result, '<',   '<',  [rfReplaceAll]);
  Result := StringReplace(Result, '&',  '&',  [rfReplaceAll]);
  Result := StringReplace(Result, crlf,  #13#10,  [rfReplaceAll]);

end;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文