Пишем простой парсер rss-лент на Delphi.
Доброго времени суток, господа и дамы, читающие мой блог. Сегодня, я немного отклонюсь от темы заработка в сети и начну цикл статей, посвящённых программированию. Теперь, они будут идти вперемешку (на что вдохновения хватит - о том и напишу:)).
Из сегодняшней статьи вы узнаете, как можно написать небольшой rss-парсер средствами Delphi7.
Данный материал будет полезен для новичков, которые только начинают знакомиться с программированием для интернета.
Данный материал будет полезен для новичков, которые только начинают знакомиться с программированием для интернета.
Этот парсер будет грабить rss ленту в формате xml и выводить список постов. При нажатии на название, в текстовое поле будет выведен заголовок и краткий текст поста.
Настраиваем внешний вид программы.
Для начала, киньте на форму следующие компоненты:
ListBox - 2 штуки.
Memo - 1 штуку.
CheckBox, Edit, Button - по-одному.
Так, это всё, что на вкладке стандарт.
Дальше - следует перейти на вкладку Indy Clients и поместить на форму компонент IdHTTP.
Дальше - следует перейти на вкладку Indy Clients и поместить на форму компонент IdHTTP.
При желании, можно добавить ещё и компонент IdAntiFreeze со вкладки Indy Misc.
В итоге, у меня получился такой внешний вид:
Переходим к написанию кода.
Шаг номер два (а по-важности - так вообще один :)) в написании нашего граббера rss - кодинг.
Основной код будет, как, наверное, всем понятно, в обработчике нажатия на кнопку "Сграбить".
Для начала - объявляем переменные:
var
rss,title,desc:WideString;
i:integer;
Очищаем листбоксы и присваиваем переменной i значение 1:
Загружаем в переменную rss полный текст сграбленой rss ленты:ListBox1.Clear;
ListBox2.Clear;i:=1;
rss:=IdHTTP1.Get(Edit1.Text);Начало цикла парсинга rss:
while (i<=length(rss)) doТеперь - подробней о блоке парсинга:
begin
if pos('<title>',rss)<>0 then
begin
В общем, для заголовка он выглядит следующим образом:
//Парсинг title
Delete(rss,1,pos('<title>',rss)+length('<title>')-1);
title:=copy(rss,1,pos('</title>',rss)-1);
title:=StringReplace(title,'"','"',[rfReplaceAll]);
//Вывод titleЗдесь мы, построчно, вырезаем, используя операторы delete и copy, текст заголовка и записываем его в переменную title.
if CheckBox1.Checked then
ListBox1.Items.Add(utf8toansi(title))
else
ListBox1.Items.Add(title);
Последней строкой в блоке парсинга мы заменяем весьма не нравящийся мне оператор " на двойные кавычки.
Следующий блок - блок записи переменных листбокс.
Если выбран параметр "Перекодировать", то переменная, прежде чем попасть в листбокс, проходит через функцию utf8toansi, которая преобразует получающиеся, порой, "кракозябры" во вполне читаемый текст. Хотя, в некоторых лентах это не нужно.
Аналогично происходит и с переменной desc.
Завершаем цикл:
end;
inc(i);
end;
Последним шагом, сделаем так, чтоб при щелчке по названию поста, в мемо добавлялся заголовок и текст описания. Для этого, в обработчике OnClick, компонента ListBox1, добавьте следующие строки:
Memo1.Text:=ListBox1.Items[ListBox1.itemindex]+#13+#10+
ListBox2.Items[ListBox1.itemindex];
Вот и всё. Для тех, кто не понял, полный код двух обработчиков:
procedure TForm1.Button1Click(Sender: TObject);
var
rss,title,desc:WideString;
i:integer;
begin
ListBox1.Clear;
ListBox2.Clear;
i:=1;
rss:=IdHTTP1.Get(Edit1.Text);
while (i<=length(rss)) do
begin
if pos('<title>',rss)<>0 then
begin
//Ïàðñèíã title
Delete(rss,1,pos('<title>',rss)+length('<title>')-1);
title:=copy(rss,1,pos('</title>',rss)-1);
title:=StringReplace(title,'"','"',[rfReplaceAll]);
//Âûâîä title
if CheckBox1.Checked then
ListBox1.Items.Add(utf8toansi(title))
else
ListBox1.Items.Add(title);
//Ïàðñèíã desc
Delete(rss,1,pos('<description>',rss)+length('</description>')-2);
desc:=copy(rss,1,pos('</description>',rss)-1);
desc:=StringReplace(desc,'"','"',[rfReplaceAll]);
//Âûâîä desc
if CheckBox1.Checked then
ListBox2.Items.Add(utf8toansi(desc))
else
ListBox2.Items.Add(desc);
end;
inc(i);
end;
end;
procedure TForm1.ListBox1Click(Sender: TObject);
begin
Memo1.Text:=ListBox1.Items[ListBox1.itemindex]+#13+#10+
ListBox2.Items[ListBox1.itemindex];
end;
Надеюсь, всё изложил понятно и данный материал поможет вам написать свой собственный грабер rss лент, или, быть может, сделать что-то на подобии rss-доргена, который у меня так и не доходят руки дописать.
В следующих статьях по программированию, я опишу, как можно получать ТИЦ сайта, ещё один способ парсинга rss и многое другое.
Подписывайтесь на обновления, чтобы быть в курсе!
Всего доброго!
Комментариев нет:
Отправить комментарий