Получите отобранный текст из HTML (Delphi)
-
25-09-2019 - |
Вопрос
У меня есть HTML, и мне нужно извлечь фактический письменный текст со страницы.
До сих пор я попробовал использовать веб-браузер и рендурирующую страницу, затем перейти в свойство документа и захватить текст. Это работает, но только там, где поддерживается браузер (т.е. com объект). Проблема в том, что я хочу, чтобы это могло работать под вином, поэтому мне нужно решение, которое не использует COM.
Должен быть программитический способ сделать это, что разумно.
Решение
Я не уверен, какой рекомендуемый способ разброса HTML в Delphi, но если бы это был я, я был бы соблазнен просто разбить копию HTML2Text (либо старше C ++ программа на это имя или новее Python Program) и пороть звонок к одному из них.
Вы можете включить Python HTML2Text в исполняемый файл, используя Py2exe.. Отказ Оба программа HTML2Text лицензированы под GPL, но до тех пор, пока вы просто подключите их исполняемый файл с вашим приложением и сделайте их источником в соответствии с ограничениями GPL, вы должны быть в порядке.
Другие советы
Вместо того, чтобы использовать TwebBrowser, вы можете напрямую использовать метод TIDHTTP и его получить.
Вы получаете HTML-строку обратно.
Вот хорошая простая рутина, скопированы из 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;
Затем вы можете легко изменить это сделать именно то, что вы хотите.