我有一些HTML,我需要從頁面中提取實際的書面文字。從HTML獲取呈現的文本(德爾福)
到目前爲止,我已經嘗試使用Web瀏覽器和呈現頁面,然後去文檔屬性和抓取文本。這可以工作,但只適用於支持瀏覽器的地方(IE com對象)。問題是我希望這也能夠在wine下運行,所以我需要一個不使用IE COM的解決方案。
必須有一個程序化的方式來做到這一點是合理的。
我有一些HTML,我需要從頁面中提取實際的書面文字。從HTML獲取呈現的文本(德爾福)
到目前爲止,我已經嘗試使用Web瀏覽器和呈現頁面,然後去文檔屬性和抓取文本。這可以工作,但只適用於支持瀏覽器的地方(IE com對象)。問題是我希望這也能夠在wine下運行,所以我需要一個不使用IE COM的解決方案。
必須有一個程序化的方式來做到這一點是合理的。
我不知道是什麼在Delphi解析HTML的推薦方式是,但如果是我,我會受到誘惑,只是捆綁html2text複印件(或者該名稱老C++ program或較新的Python program )併產生一個電話給其中一個。
您可以使用py2exe將Python html2text轉換爲可執行文件。這兩個html2text程序都是在GPL下獲得許可的,但只要您將其可執行文件與您的應用捆綁在一起,並根據GPL的限制使其源代碼可用,那麼您應該沒問題。
除了使用TWebBrowser,您可以直接使用TIdHttp及其Get方法。
你得到了html字符串。
這是底層的HTML,而不是渲染的文本。 「渲染」是指如果人們看着在屏幕上顯示頁面的Web瀏覽器,人們會閱讀的文本。 – 2010-06-08 22:25:14
哦,好的。我以爲OP想要獲得HTML而不需要IE瀏覽器。儘管如此,這將是第一步。 ...和是的,我應該仔細閱讀;-) – 2010-06-08 22:44:01
結合StripHTMLTags(@lkessler),這將成爲一個不錯的選擇。 – 2010-06-09 11:52:45
這裏是一個不錯的簡單套路,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;
此後可以輕鬆地修改此做你想要什麼。
其中一個textmode瀏覽器(如lynx/links/w3c)也可能會這樣做(iirc有一個參數 - 用afaik w3c轉儲),並且它們可能在某處有mingw版本。或者至少他們在cygwin – 2010-06-09 11:35:42