Помогите с парсингом

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by snookis, 12 Jul 2012.

  1. snookis

    snookis New Member

    Joined:
    5 Jun 2011
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Вот моя функция:
    Code:
    function Pars(st,st_begin,st_end:WideString):WideString;
    begin
    if pos(st_begin,st)<>0 then
    Delete(st,1,pos(st_begin,st)+length(st_begin))
    else
    begin
    Pars:='not str pars';
    exit;
    end;
    if pos(st_end,st)<>0 then
    Delete(st,pos(st_end,st),length(st))
    else
    begin
    Pars:='not str pars';
    exit;
    end;
    Pars:=st;
    end;
    вот сам ГЕТ запрос сразу после пост:
    Code:
    StrPars:=HTTP.Get('http://m.mail.ru/cgi-bin/gosearch?q_query='+form1.edit3.text);
          StrPars:=('</option><option value="0" >Входящие (.*?)</option></select>');
    Delete(StrPars,1,pos('>',StrPars));
    st:=copy(StrPars,1,pos('<',StrPars)-1);
    form1.Memo2.Lines.Add(Acc+';'+Pas + ' | ' +St);
    Дело в том что мне нужно спарсить количество сообщений по запросу:
    Code:
    http://m.mail.ru/cgi-bin/gosearch?q_query=[COLOR=Navy]@em.ea.com[/COLOR]
    Но дело в том что оно мне выводит вот с этой строки:
    StrPars:=('</option><option value="0" >Входящие (.*?)</option></select>');
    в мой мемо Входящие (.*?) - в прямом смысле.... Точне оно не парсит со страницы. а тупо выводит Входящие (.*?)
     
  2. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    А можно спросить? ЧТО ЭТО - "(.*?)". Лично на мой взгляд в данный момент это просто строка вида - "(.*?)" никак не кусок регулярного выражению. Если ты конечно прочитал регулярки и пытаешься спарсить регуляркой какое-то выражения без создания этой регулярки. Иначе я всё же я не понял, что это такое! :(

    Неужели так сложно написать код из 12 строк. Используя стандартные функции Windows?

    Code:
      function ParseInv(S : String): String;
      begin
        if Pos('Входящие (', S) <> 0 then
          begin
            Result := Copy(S, Pos('Входящие (', S) + 10, Length(S));
            Result := Copy(Result, 0, Pos(')</option', Result) - 1);
          end
          else
          begin
            Result := 'ERROR';
          end;
      end;
    
     
  3. snookis

    snookis New Member

    Joined:
    5 Jun 2011
    Messages:
    13
    Likes Received:
    0
    Reputations:
    0
    Не работает!! Я уже перепробывал кучу всяких видов парсера и не хрена оно мне не выводит!!!
     
  4. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Во-первых надо авторизоваться через программу.
    Во-вторых посмотреть кодировку.

    P.S. Сами ничего не хотите делать как я понимаю!
     
  5. Redfern89

    Redfern89 New Member

    Joined:
    12 Jul 2012
    Messages:
    42
    Likes Received:
    1
    Reputations:
    -3
    а ты посмотрел, в какой кодировке тебе приходит ответ от сервера? Просто кириллистические символы могут прити в виде какозябр и естесственно ты не спарсишь ничего ))

    вставь мемо на форму и до строки
    Code:
    [B] StrPars:=('</option><option value="0" >Входящие (.*?)</option></select>');[/B]
    напиши
    Code:
    memo1.text := StrPas
     
  6. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Ну наверное надо поменять кодировку, тебе так не казалось никогда?

    Code:
    procedure ParseMessageMailRU;
      Login : String = ''; // логин
      Pass : String = ''; // пароль
      Domen : String = 'mail.ru'; // mail.ru, list.ru, bk.ru и т.д.
    var
      S : String;
      HTTP : TIdHTTP;
      Response : TStringStream;
    begin
      HTTP := TIdHTTP.Create(nil);
      HTTP.AllowCookies := True;
      HTTP.HandleRedirects := True;
      HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
      HTTP.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
      HTTP.Request.AcceptLanguage := 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3';
      Response := TStringStream.Create('');
      try
        try
          Response.Clear;
          HTTP.Get('http://m.mail.ru/cgi-bin/auth?Login=' + Login + '&Password=' + Pass + '&Domain=' + Domen + '&level=1', Response);
        except
    
        end;
        if Pos('выход', Utf8ToAnsi(Response.DataString)) <> 0 then
          begin
            try
              Response.Clear;
              HTTP.Get('http://m.mail.ru/cgi-bin/gosearch', Response);
            except
    
            end;
            if Pos('tab">Папки', Utf8ToAnsi(Response.DataString)) <> 0 then
              begin
                S := Copy(Utf8ToAnsi(Response.DataString), Pos('tab">Папки', Utf8ToAnsi(Response.DataString)) + 12, Length(Utf8ToAnsi(Response.DataString)));
                S := Copy(S, 0, Pos(')</a></td', S) - 1);
                if S = '' then
                  S := 'Всего входящих: 0'
                else
                  S := 'Всего входящих: ' + S;
                MessageBox(0, PChar(S), 'Info', MB_OK + MB_ICONINFORMATION);
              end
              else
              begin
                MessageBox(0, 'Ошибка!', 'Error', MB_OK + MB_ICONSTOP);
              end;
          end
          else
          begin
            MessageBox(0, 'Авторизация не удалась :( ', 'Error', MB_OK + MB_ICONSTOP);
          end;
      finally
        FreeAndNil(HTTP);
        FreeAndNil(Response);
      end;
    end;
    
    P.S. 5 минут делов, когда включаешь голову и руки!