Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление тегов из ХТМЛ-страницы


Страницы:   1 2

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](


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо