Перейти к содержанию
Fire Monkey от А до Я
  • 0

Парсинг регулярными выражениями


HyperZen

Вопрос

Добрый день!

При парсинге сайта (bash.im) и при использовании компонента TRegExpr и компиляции программы под Windows все работает нормально:

procedure TForm1.Button22Click(Sender: TObject);
var
  s: string;
  regexpr: TRegExpr;
  ss: TStringStream;
begin
  ss := TStringStream.Create('', TEncoding.GetEncoding(1251));
  try
    IdHTTP1.Get('http://bash.im/', ss);
    ss.Position := 0;
    s := ss.DataString;
  finally
    ss.Free;
  end;
 
  regexpr := TRegExpr.Create;
  try
    regexpr.Expression :=
      'class="date">(.*?)<.*?class="id">(.*?)<.*?class="text">(.*?)<';
 
    if regexpr.Exec(s) then
      repeat
        mmoLetters.Lines.Add(regexpr.Match[1]);
        mmoLetters.Lines.Add(regexpr.Match[2]);
        mmoLetters.Lines.Add(regexpr.Match[3]);
      until not regexpr.ExecNext;
  finally
    regexpr.Free
  end;
 
end;

Но при компиляции приложения под Android, выдает ошибку...

 

Использую RegularExpressions из состава Delphi 10 Seattle:

uses
  System.RegularExpressions
...
procedure TfrmMain.ParsingBashNew(URLToPars: string);
var
  Matches: TMatchCollection;
  RegExpr: TRegEx;
  i: Integer;
  RegularExpressString : string;
begin
  mmoNew.Lines.Clear;
 
  HTMLText := IdHTTP1.Get(URLToPars);
 
  RegularExpressString := 'class="date">(.*?)<.*?class="id">(.*?)<.*?class="text">(.*?)<';
 
  RegExpr := TRegEx.Create(RegularExpressString, [roIgnoreCase, roMultiLine]);
 
  Matches := RegExpr.Matches(HTMLText);
 
  if Matches.Count > 0 then
    begin
      mmoNew.BeginUpdate;
        for i := 0 to Matches.Count -1 do
          begin
            mmoNew.Lines.Add(Matches.Item[i].Groups[1].Value);
            mmoNew.Lines.Add(Matches.Item[i].Groups[2].Value);
            mmoNew.Lines.Add(Matches.Item[i].Groups[3].Value);
            mmoNew.Lines.Add('==============================');
          end;
      mmoNew.EndUpdate;
    end;
end;

То же самое регулярное выражение на работает. В чем может быть загвоздка? (если отбросить последнюю составляющую регулярки - '.*?class="text">(.*?)<'    - тоже все работает!)

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Использовал для этого библиотеку Boost, но работает по разному в версиях 1.39 и 1.55, для виндовс 32 и 64 соответственно. Советую Вам внимательнее изучить работу сайта, данные не идут ли в JSON формате? обычно их обрабатывает на клиентской стороне браузер, если так то решение будет очень даже элегантным, и бонусы в виде уменьшения трафика.

Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...