. Как я зарабатываю в сети.: Простой парсер rss

четверг, 14 июня 2012 г.

Простой парсер rss

Пишем простой парсер rss-лент на Delphi.

Доброго времени суток, господа и дамы, читающие мой блог. Сегодня, я немного отклонюсь от темы заработка в сети и начну цикл статей, посвящённых программированию. Теперь, они будут идти вперемешку (на что вдохновения хватит - о том и напишу:)).
Из сегодняшней статьи вы узнаете, как можно написать небольшой rss-парсер средствами Delphi7.
Данный материал будет полезен для новичков, которые только начинают знакомиться с программированием для интернета.
Этот парсер будет грабить rss ленту в формате xml и выводить список постов. При нажатии на название, в текстовое поле будет выведен заголовок и краткий текст поста.

Настраиваем внешний вид программы.

Для начала, киньте на форму следующие компоненты:

ListBox - 2 штуки.
Memo - 1 штуку.
CheckBox, Edit, Button - по-одному.
Так, это всё, что на вкладке стандарт.
Дальше - следует перейти на вкладку Indy Clients и поместить на форму компонент IdHTTP.
При желании, можно добавить ещё и компонент IdAntiFreeze со вкладки Indy Misc.

В итоге, у меня получился такой внешний вид:

 

Переходим к написанию кода. 

Шаг номер два (а по-важности - так вообще один :)) в написании нашего граббера rss - кодинг.
Основной код будет, как, наверное, всем понятно, в обработчике нажатия на кнопку "Сграбить".
Для начала - объявляем переменные:
 var
 rss,title,desc:WideString;
 i:integer;

Очищаем листбоксы и присваиваем переменной i значение 1:
ListBox1.Clear;
ListBox2.Clear;
i:=1;
 Загружаем в переменную rss полный текст сграбленой rss ленты:
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,'&quot;','"',[rfReplaceAll]);

       //Вывод title
       if CheckBox1.Checked then
       ListBox1.Items.Add(utf8toansi(title))
       else
       ListBox1.Items.Add(title);
Здесь мы, построчно, вырезаем, используя операторы delete и copy, текст заголовка и записываем его в переменную title.
Последней строкой в блоке парсинга мы заменяем весьма не нравящийся мне оператор &quot; на двойные кавычки.
Следующий блок - блок записи переменных листбокс.
Если выбран параметр "Перекодировать", то переменная, прежде чем попасть в листбокс, проходит через функцию 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,'&quot;','"',[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,'&quot;','"',[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 и многое другое.
Подписывайтесь на обновления, чтобы быть в курсе!
Всего доброго!

Комментариев нет:

Отправить комментарий