Быстрый парсер html кода на Delphi

Что такое парсер? Парсер – это программа, которая парсит текст, по заданному алгоритму.

Что такое парсить? Парсить – анализировать и расставлять символы, входящие в текст в соответствии заложенного алгоритма, например, для удобного восприятия текста программистом.

Для чего нужен парсер? Парсер я использую для приведения html тегов к единой структуре: одинаковый размер букв, новый тег на новой строчке, удаление пустых строк.

Кроме структурирования информации с помощью парсера, можно добавить алгоритмы логического изменения текстов. Исправления орфографических ошибок, перевода на другой язык, в том числе и на машинные коды, скрипты.

Распарсить можно любую информацию по любому алгоритму, результатом проделанной работы будет та же информация, представленная в ином виде.

Далее привожу код структурирования тегов, цель работы алгоритма – разместить по 1 тегу на каждую строчку memo. В рабочей версии кода программа загружает Html страницы согласно их вложенности в сайте и парсит их, после чего заменяет их.

Для зашиты от дураков оставлю часть кода, который был в основной программе, для демонстрации просто удалите код под комментариями – ///


unit Unit1;  
interface  
  
uses  
  
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  Dialogs, StdCtrls;  
  
type  
  
  TForm1 = class(TForm)  
    Button7: TButton;  
    Button13: TButton;  
    Memo1: TMemo;  
    Memo2: TMemo;  
    procedure Button7Click(Sender: TObject);  
    procedure Button13Click(Sender: TObject);  
      
  private  
    { Private declarations }  
  
  public  
    { Public declarations }  
  
  end;  
  
var  
  Form1: TForm1;  
  
implementation  
  
{$R *.dfm}  
  
procedure TForm1.Button7Click(Sender: TObject);  
label 1;  
var  
i,j,k,g:integer;  
bol:boolean;  
position:integer;  
str:string;  
begin  
//chdir(edit1.Text);   /// рабочая папка  
//poiskpapki;         /// процедура для создания списка файлов в папке.  
       memo2.Clear;  
     ///здесь был код загрузки следующего файла  
     for i:= 0 to memo1.Lines.Count - 1 do  
       begin  
          str:= memo1.Lines;  
          1:  
          position := AnsiPos('>',  str);  
          if  position<>0 then  
                           begin  
                           memo2.Lines.Add(copy(str,1,position));  
                           delete(str,1,position);  
                           goto 1;  
                           end;  
        if  position=0    then    memo2.Lines.Add(str);  
         end;  
        memo1.Text:=memo2.Text;  
     ///здесь был код сохранения следующего файла  
  //продолжаем парсить  
  button13.Click;  
end;  
  
procedure TForm1.Button13Click(Sender: TObject);  
label 1;  
var  
i,j,k,g:integer;  
bol:boolean;  
position:integer;  
str:string;  
begin  
//chdir(edit1.Text);     /// рабочая папка  
//poiskpapki;           /// процедура для создания списка файлов в папке.  
          memo2.Clear;  
    ///здесь был код загрузки следующего файла  
     for i:= 0 to memo1.Lines.Count - 1 do  
       begin  
          str:= memo1.Lines;  
          1:  
          position := AnsiPos('<',  str);  
          if  position>1 then  
                           begin  
                           memo2.Lines.Add(copy(str,1,position-1));  
                           delete(str,1,position-1);  
                           goto 1;  
                           end;  
          memo2.Lines.Add(str);  
///здесь был код сохранения следующего файла.  
  end;  
 //продолжаем парсить убираем пустые строки  
 // здесь был код.  
end;  
end.  

В алгоритме используется рекурсивный цикл перенос до и после знаков открытии закрытии тегов.

Что называют парсерами? Я сделал поиск по форуму по ключевому слову – парсер, движок мне предложил ряд тем, в которых обсуждалось использование и применение парсера. Попробую прокомментировать эти темы, и по возможности дать ответ.

26.04.2007, 16:39 на форуме – programmersforum.ru была создана тема – XML Parser с поддержкой XSLT

Я пишу электронный учебник. Текст хранится в XML файле. При загрузке файла строится дерево по главам в TreeView, а сам текст отображается в RichView. И вот надо чтобы текст отображался со всеми ссылками, картинками, мультимедиа и т.д. В данный момент я добиться этого не могу. У меня отображается простой текст

На тот момент я ничего не смог посоветовать, а сейчас могу сказать, что вопрос был не совсем корректный. Парсером можно только создать структуру, изменить ее, но для отображения нужно создавать инструменты, которые будут по-другому называться.

27.10.2007, 18:29 на форуме – programmersforum.ru была создана тема – Парсер для обработки тагов

Есть некоторый текст из N символов. В этом тексте содержатся разные таги (table, tr, td, img, a). Нужно этот текст разделить на несколько равных частей, т.е сделать постраничный вывод для этого текста. Возникают такие ситуации, когда при разделении текста половина тага находится в одной части, другая половина находится в другой. Чтобы этого избежать, нужно обрабатывать эти таги. Может быть кто-нибудь подскажет, есть ли готовые решения подобных парсеров или же может кто делал что-то подобное. Буду признателен за любую информацию.

Отвечаю, есть решение, с него и начал эту статью, код представлен выше.

07.01.2008, 00:54 на форуме – programmersforum.ru была создана тема – пример парсинга


procedure TForm1.Button1Click(Sender: TObject);  
var  
  Stream: TStream;  
  s: string;  
begin  
  Stream := TMemoryStream.Create;  
  try  
    { получаем текст области редактирования и помещаем его в поток }  
    s := memo1.Text;  
   Stream.WriteBuffer(s[1], length(s));  
    { сбрасываем стартовую позицию потока и создаем парсер }  
    Stream.Position := 0;  
    with TParser.Create(Stream) do  
    try  
      { "добываем" числа и добавляем их в список }  
      while Token <> toEOF do  
      begin  
        CheckToken(toInteger); { возбуждаем исключение, если не toInteger }  
        Listbox1.Items.Add(IntToStr(TokenInt));  
        NextToken;  
      end;  
    finally  
      Free;  
    end;  
  finally  
    Stream.Free;  
  end;  

Пыталься переделать под String не чего не выходит он в listbox выводит по буквено тоесть слово:
Например
Выведет так:
Н
а
п
р
и
м
е
р


Ответ дали там же на форуме –


procedure TForm1.Button1Click(Sender: TObject);  
var  
  Stream: TStream;  
  s: string;  
begin  
  Stream := TMemoryStream.Create;  
  try  
    { получаем текст области редактирования и помещаем его в поток }  
    s := memo1.Text;  
    Stream.WriteBuffer(s[1], length(s));  
    { сбрасываем стартовую позицию потока и создаем парсер }  
    Stream.Position := 0;  
    with TParser.Create(Stream) do  
    try  
      { "добываем" числа и добавляем их в список }  
      s := '';  
      while Token <> toEOF do  
      begin  
        CheckToken(toInteger); { возбуждаем исключение, если не toInteger }  
        //Listbox1.Items.Add(IntToStr(TokenInt));   -->  
        s := s + IntToStr(TokenInt);  
        NextToken;  
      end;  
    finally  
      Free;  
    end;  
  finally  
    Stream.Free;  
  end;  

Вован вам ответил на ваш вопрос – как сделать, чтобы символы выводились в строку, а не в столбец (упустил, правда, один оператор – Listbox1.Items.Add(s), но это только от того, что торопился вам помочь побыстрее).
Теги:
парсер html
Добавлено: 01 Августа 2018 07:13:31 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...