• 0
HyperZen

Регулярное выражение для сайта...

Вопросы

Помогите, пожалуйста, составить регулярное выражение для парсинга сайта https://zadolba.li

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

procedure TForm1.btnStartClick(Sender: TObject);
var
  HeadMatches, MsgMatches: TMatchCollection;
  CountPagesMatch: TMatch;
  HeadRegularExprString : string;
  MsgRegularExprString : string;
  HTMLText : string;                      // текст для парсинга
begin
    TTask.Run(
      procedure
      var
        aHttp: THTTPClient;
        aStr: TStringStream;
      begin
        aHttp := THTTPClient.Create;
        aStr := TStringStream.Create('', TEncoding.UTF8);
          try
            aHttp.Get('https://zadolba.li', aStr);
            HTMLText := aStr.DataString;
          finally
            aHttp.Free;
            aStr.Free;
        end;

        TThread.Synchronize(TThread.CurrentThread,
          procedure
          var
            i: Integer;
            begin
              mmoText.Lines.Clear;

              HeadRegularExprString := '<h2><a href="\/story.*?>(.*?)<\/a>';

//              MsgRegularExprString := '';

              HeadMatches := TRegEx.Matches(HTMLText, HeadRegularExprString, [roIgnoreCase, roMultiLine]);
//              MsgMatches := TRegEx.Matches(HTMLText, MsgRegularExprString, [roIgnoreCase, roMultiLine]);


//              if HeadMatches.Count = MsgMatches.Count then
//                begin
                    for i := 0 to HeadMatches.Count - 1 do
                      begin
                        mmoText.Lines.Add(HeadMatches.Item[i].Groups[1].Value);
                      end;

//                      end;
                end);
            end);
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 ответов на этот вопрос

  • 0

В общем получилось две регулярки:

HeadRegularExprString := '<h2><a href="\/story\/.*>(.*?)<\/a>([\s\S]+?).*class=''date-time''>(.*?)<\/div>';
MsgRegularExprString := '<div class=''text''>([\s\S]*?)<\/div>';

HeadMatches := TRegEx.Matches(HTMLText, HeadRegularExprString, [roIgnoreCase, roMultiLine]);
MsgMatches := TRegEx.Matches(HTMLText, MsgRegularExprString, [roIgnoreCase, roMultiLine]);

Все работает корректно, с вышеуказанного сайта парсятся статьи. В TListView создается от 5 до 10 айтемов. Статьи достаточно длинные, TListView начинает безбожно тормозить при скроллинге. Объясните, пожалуйста, почему?!

Изменено пользователем HyperZen

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

а где кот?

тот который листвью

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вот кот:      )))

procedure TfrmMain.ParsingZadolbali(URLToPars: string; aListView: TListView);
var
  TempText : string;
  HeadMatches, MsgMatches, RatingMatches, NumberCitateMatches: TMatchCollection;
  HeadRegularExprString, NumberCitateExprString, MsgRegularExprString, RatingRegularExprString : string;
begin
  try
    fgActivityDialog1.Message := 'Загрузка цитат...';
    fgActivityDialog1.Show;

    lblParsSite.Text := ZadolbaliOfficialSite;

    TTask.Run(
      procedure
      var
        aHttp: THTTPClient;
        aStr: TStringStream;
      begin
        aHttp := THTTPClient.Create;
        aStr := TStringStream.Create('', TEncoding.UTF8);
          try
            aHttp.Get(URLToPars, aStr);
            HTMLText := aStr.DataString;
          finally
            aHttp.Free;
            aStr.Free;
        end;

        TThread.Synchronize(TThread.CurrentThread,
          procedure
          var
            i: Integer;
            begin
              aListView.Items.Clear;

              HeadRegularExprString := '<h2><a href="\/story\/.*>(.*?)<\/a>([\s\S]+?).*class=''date-time''>(.*?)<\/div>';
              MsgRegularExprString := '<div class=''text''>([\s\S]*?)<\/div>';
              NumberCitateExprString := '<div class=''id''>\s*<span>(.*?)<\/span>';
              RatingRegularExprString := '<div class="rating"><span>(.*?)<\/span>';

              HeadMatches := TRegEx.Matches(HTMLText, HeadRegularExprString, [roIgnoreCase, roMultiLine]);
              MsgMatches := TRegEx.Matches(HTMLText, MsgRegularExprString, [roIgnoreCase, roMultiLine]);
              NumberCitateMatches := TRegEx.Matches(HTMLText, NumberCitateExprString, [roIgnoreCase, roMultiLine]);
              RatingMatches := TRegEx.Matches(HTMLText, RatingRegularExprString, [roIgnoreCase, roMultiLine]);


              for i := 0 to HeadMatches.Count - 1 do
                begin
                  TempText := HTMLClear(MsgMatches.Item[i].Groups[1].Value);

                    with aListView.Items.Add do
                      begin
                        Data['DateText'] := HeadMatches.Item[i].Groups[3].Value;
                        Data['CitateText'] := '№ ' + NumberCitateMatches.Item[i].Groups[1].Value;
                        Data['RatingText'] := '-=' + RatingMatches.Item[i].Groups[1].Value + '=-';
                        Data['MainText'] := HeadMatches.Item[i].Groups[1].Value + sLineBreak + '***********' + TempText + sLineBreak;
                        Data['imgCopy'] := il1.Bitmap(TSizeF.Create(32, 32),0);
                        Data['imgVenzel'] := il1.Bitmap(TSizeF.Create(150, 20),1);
                      end;
                end;

                  ToUp(aListView);  // встаем в начало

                  aListView.Resize;

                  fgActivityDialog1.Hide;
            end);
      end);

    except
      On E: Exception do ShowMessage('Ошибка: ' + E.Message);
    end;
end;

 

Листвью в режиме динамик...

Забыл упомянуть - тормоза только после парсинга сайта zadolba.li, с баша цитаты тянутся по 50 штук - никаких тормозов в листвью нет вообще, все скроллится на изумление гладко :)

Изменено пользователем HyperZen

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Может стоит забить на парсинг html, а использовать специально созданный для таких целей rss интерфейс https://zadolba.li/rss  ?

Там вам все отдается в xml и чудесно раскладывается по полочкам штатными средствами 

Изменено пользователем Евгений Корепов

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Да, интереснее разбирать страницу xml. Но тут дело в другом, именно в тормозах ListView при помещении в его Item большого текста...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
15 часов назад, HyperZen сказал:

Да, интереснее разбирать страницу xml. Но тут дело в другом, именно в тормозах ListView при помещении в его Item большого текста...

Отрендерьте текст в битмап ))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   1 пользователь онлайн