2010-06-08 21 views
4

我有一些HTML,我需要從頁面中提取實際的書面文字。從HTML獲取呈現的文本(德爾福)

到目前爲止,我已經嘗試使用Web瀏覽器和呈現頁面,然後去文檔屬性和抓取文本。這可以工作,但只適用於支持瀏覽器的地方(IE com對象)。問題是我希望這也能夠在wine下運行,所以我需要一個不使用IE COM的解決方案。

必須有一個程序化的方式來做到這一點是合理的。

回答

4

我不知道是什麼在Delphi解析HTML的推薦方式是,但如果是我,我會受到誘惑,只是捆綁html2text複印件(或者該名稱老C++ program或較新的Python program )併產生一個電話給其中一個。

您可以使用py2exe將Python html2text轉換爲可執行文件。這兩個html2text程序都是在GPL下獲得許可的,但只要您將其可執行文件與您的應用捆綁在一起,並根據GPL的限制使其源代碼可用,那麼您應該沒問題。

+0

其中一個textmode瀏覽器(如lynx/links/w3c)也可能會這樣做(iirc有一個參數 - 用afaik w3c轉儲),並且它們可能在某處有mingw版本。或者至少他們在cygwin – 2010-06-09 11:35:42

1

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

+1

這是底層的HTML,而不是渲染的文本。 「渲染」是指如果人們看着在屏幕上顯示頁面的Web瀏覽器,人們會閱讀的文本。 – 2010-06-08 22:25:14

+0

哦,好的。我以爲OP想要獲得HTML而不需要IE瀏覽器。儘管如此,這將是第一步。 ...和是的,我應該仔細閱讀;-) – 2010-06-08 22:44:01

+1

結合StripHTMLTags(@lkessler),這將成爲一個不錯的選擇。 – 2010-06-09 11:52:45

1

這裏是一個不錯的簡單套路,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; 

此後可以輕鬆地修改此做你想要什麼。