【问题标题】:Get the rendered text from HTML (Delphi)从 HTML (Delphi) 获取呈现的文本
【发布时间】:2011-03-01 09:29:27
【问题描述】:

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

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

必须有一种合理的编程方式来做到这一点。

【问题讨论】:

    标签: html delphi html-parsing html-content-extraction


    【解决方案1】:

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

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

    【讨论】:

    • 其中一个文本模式浏览器(如 lynx/links/w3c)也可能这样做(iirc 有一个参数 --dump 用于 afaik w3c),并且它们可能在某处有 mingw 版本。或者至少他们在 cygwin 中
    【解决方案2】:

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

    【讨论】:

    • 这是底层的 HTML,而不是呈现的文本。 “渲染”是指人类在查看显示页面的 Web 浏览器时会阅读的文本。
    • 哦,好的。我认为 OP 想要在不需要 IE 的情况下获取 html。那将是第一步。 ...是的,我应该更仔细地阅读;-)
    • 结合 StripHTMLTags (@lkessler),这是一个不错的选择。
    【解决方案3】:

    这是一个不错的简单例程,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;
    

    然后您可以轻松地对其进行修改以完全按照您的意愿行事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2015-09-03
      • 2017-11-28
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多