![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление тегов из ХТМЛ-страницы
Pcrepair © (2012-01-18 20:47:00)Добрый день
есть код:
var
Form1: TForm1;
HTML : ustring;
//////////////////////////////////
procedure TForm1.Button1Click(Sender: TObject);
var
URL : string;
begin
URL := Edit1.Text;
Chromium1.Browser.MainFrame.LoadUrl(URL);
end;
procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
const frame: ICefFrame; httpStatusCode: Integer; out Result: Boolean);
begin
if (httpStatusCode <> 200) then Exit;
Memo1.Clear;
Chromium1.Browser.MainFrame.VisitDomProc(
procedure(const Dom: ICefDomDocument)
begin
HTML := Dom.Document.AsMarkup;
end );
Memo1.Clear;
Memo1.Lines.Add(HTML);
end;
end.
Код закачивает страницу с заданным УРЛ, производит обработку скриптов и размещает код страницы в ПЕРЕМ типа ustring
Все работает.
Далее необходимо переработать код в ПЕРЕМ ХТМЛ. В частности нужно удалить все теги типа <script..мусор...>..мусор...</script>, <style type=..мусор>...мусор...</style> и прочие такие же, типа ( ), не содержащие информации. в общем нужно радикально зачистить страницу, оставив только теги ссылок <a href= " ">...........</a> и теги таблиц <TR></TR>, чтоб ни рекламы. ни флеша, ни картинок
ВОПРОС:
каким способом это лучше сделать? может есть каки то проверенные способы уже
может есть какие то модули типа TParser? или типа того
Всем ответившим по делу - спасибо
Pcrepair (2012-01-19 15:10:00) [21]
> Откуда уверенность, что в <script..мусор...>..мусор...</script>,
> не будет нужного отображаемого контента?
уверенность есть, поскольку результаты работы скриптов уже есть в коде, загруженном в ПЕРЕМ. проверено.
>
> Есть ощущение, что сабж не раз решался через регулярные
> выражения.
конечно есть что такое уже, осталось найти и посмотреть
DVM, спасибо, будем пробовать
DVM (2012-01-19 10:16:00) [22]По аналогии [4] несложно переделать под замену/удаление/извлечение любых тегов и их параметров
DVM (2012-01-19 10:13:00) [23]Вот посмотри этот когда, я когда то писал машину состояний для разбора HTML. Не идеальна она конечно, но с моей задачей справлялась (замена всех URL на нужные мне). Класс TURLTransformer в данном случае тебе не нужен, как и функция TagHasUrl.
procedure ReplaceURLs(var S: string; ATransformer: TURLTransformer);
type
TState = (stStart, stDocType, stTag, stParam, stParamValue, stText, stComment);
var
State: TState;
i: integer;
TagName, ParamName, ParamValue: string;
Quotes, DQuotes: boolean;
S2: string;
procedure ProcessTag;
begin
//
end;
procedure ProcessParam;
begin
//
end;
procedure ProcessParamValue;
begin
if TagHasUrl(TagName, ParamName) then
ATransformer.TransformURL(ParamValue);
S2 := S2 + '="' + ParamValue + '"';
end;
begin
Quotes := False;
DQuotes := False;
S2 := '';
State := stStart;
for i := 1 to Length(S) do
begin
case State of
stStart:
case S[i] of
'<':
begin
State := stTag;
TagName := '';
end;
end;
stDocType:
case S[i] of
'>': State := stStart;
end;
stTag:
case S[i] of
'!':
if TagName = '' then
begin
if S[I+1] = '-' then
State := stComment
else
State := stDocType;
end;
' ', #9, #13, #10:
if TagName <> '' then
begin
ProcessTag;
State := stParam;
ParamName := '';
end;
'>':
begin
ProcessTag;
State := stStart;
end;
'/':
if S[i + 1] = '>' then
begin
ProcessTag;
State := stStart;
end
else
TagName := TagName + S[i];
else
TagName := TagName + S[i];
end;
stParam:
case S[i] of
' ', #9, #13, #10:
;
'=':
if ParamName <> '' then
begin
State := stParamValue;
ProcessParam;
ParamValue := '';
Quotes := false;
DQuotes := false;
end;
'>', '/':
begin
if ParamName <> '' then
ProcessParam;
State := stStart;
end;
else
ParamName := ParamName + S[i];
end;
stParamValue:
case S[i] of
'''':
if not DQuotes then
Quotes := not Quotes
else
ParamValue := ParamValue + S[i];
'"':
if not Quotes then
DQuotes := not DQuotes
else
ParamValue := ParamValue + S[i];
' ', #9, #13, #10:
if Quotes or DQuotes then
ParamValue := ParamValue + S[i]
else
begin
ProcessParamValue;
State := stParam;
ParamName := '';
end;
'/':
if S[i + 1] = '>' then
begin
State := stStart;
ProcessParamValue;
end
else
ParamValue := ParamValue + S[i];
'>':
begin
State := stStart;
ProcessParamValue;
end
else
ParamValue := ParamValue + S[i];
end;
stText:
;
stComment:
case S[i] of
'-':
if S[i + 1] = '>' then
State := stStart;
end;
end;
if State <> stParamValue then
S2 := S2 + S[i];
end;
S := S2;
end;
int64 (2012-01-19 06:33:00) [24]Видел библиотеку-конвертор из HTML в XHTML.
Задача сводится к работе с XML. Немного ресурсоемко, зато архитектурно прозрачно.
зы. Есть ощущение, что сабж не раз решался через регулярные выражения.
ззы. Откуда уверенность, что в <script..мусор...>..мусор...</script>,не будет нужного отображаемого контента?
KilkennyCat (2012-01-19 03:16:00) [25]Pos вряд ли эффективно...
тут проще пробежаться побайтово, накапливая и сравнивая. то есть, бежим, читаем байт, тут же пишем в новый текст. как только встречаем < начинаем в отдельную переменую копить, до ближайшего пробела, в новый текст не пишем. анализируем полученное, если ненужный тэг - бежим дальше, проверяем /, после него проверяем > и алгоритм улетает в начало. если нужный тэг - переменную добавляем в новый текст, алгоритм улетает в начало. это в общих чертах, конечно, но я такое когда-то делал, примитивный парсер, довольно-таки просто и очень быстро. проверка / и > - тут надо повнимательней. ее не надо проверять, если тэг не встречен или нужен.
Dennis I. Komarov (2012-01-18 21:55:00) [26]Pos[Ex](