Пятница, 03.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нашли свой исходник?
Всего ответов: 94
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Система » Текст

Быстрый парсер 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), но это только от того, что торопился вам помочь побыстрее).

Получить ссылку на материал

Категория: Текст | Добавил: Барон (20.12.2011)
Просмотров: 5114 | Теги: html, парсер, Код, delphi | Рейтинг: 5.0/2
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
ActiveX [10]
CORBA и COM [16]
Kol и MCK [23]
WinAPI [28]
Компоненты [27]
Работа с Bluetooth [4]
Железо [8]
Текст [18]
Разное [98]
Королевство Delphi © 2010-2024
Яндекс цитирования