Delphi требуется функция парсера

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by triblekill, 8 Jan 2018.

  1. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Нужна функция парсера от конца до начала, а никак многие от начала до конца

    что то вроде Downto('<a>',memo1.text,'<td>')
     
  2. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    PHP:
    var
    mylist:TStringList//Переменная под список для парсинга
    i,k:integer;
    s:string;
    begin
    mylist
    :=TStringList.Create//инициализируем список
    mylist.Add('<a>1111111111111<td>'); // заполняем
    mylist.Add('<a>2222222222222<td>'); // список
    mylist.Add('<a>3333333333333<td>'); // для примера
    for i:=mylist.count-1 downto 0 do // обратный цикл от количества строк-1 до 0
        
    begin
          s
    :=mylist.Strings[i]; // во временную переменную заносим текущую строку
          
    Delete(s,1,3); // удаляем первые 3 символа, у нас это <a>
          
    k:=pos('<td>',s); // ищем позицию <td>
          
    Delete(s,k,4); // удаляем 4 символа, начиная с начала расположения <td>
          
    Memo1.Lines.Add(s); // добавляем очищенную строку в Memo
        
    end;
    end;
     
    #2 #colorblind, 8 Jan 2018
    Last edited: 8 Jan 2018
  3. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Спасибо, а что скажешь если вот так:

    Code:
    function Pars(T_, ForS, _T: string): string;
    var
      a, b,iu: integer;
    begin
    
      Result := '';
        for iu:=Length(ForS)-1 downto 0 do begin
      if (T_ = '') or (ForS = '') or (_T = '') then  Exit;
      a := Pos(T_, ForS);
      if a = 0 then    Exit
      else  a := a + Length(T_);
      ForS := Copy(ForS, a, Length(ForS) - a + 1);
      b := Pos(_T, ForS);
      if b > 0 then Result := Copy(ForS, 1, b - 1);
    end;
    end;
    
    Правильно ли так будет ?
     
  4. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Не правильно. В параметрах ты передаешь строку, цикл вообще бесполезен.
    Поэтому возникает несколько вопросов:
    1. Начнем с того, какие параметры ты хочешь передавать в функцию? T_, ForS, _T ни о чем не говорят.
    2. В каком виде и откуда данные будут подаваться
    3. Что ты хочешь иметь на выходе
     
    #4 #colorblind, 8 Jan 2018
    Last edited: 8 Jan 2018
    triblekill likes this.
  5. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    1. Здесь передаётся так: от,исх код страницы, до
    2. Данные из string
    3. На выходе будет резка от включительно и до и остаются данные которые хочу спарсить
    Вот поэтому нужен хороший парсер так как данные первые этот не хватает, только со вторых
     
  6. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    все-равно током не понял. давай несколько вариантов входных и выходных данных
     
  7. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    276
    Likes Received:
    282
    Reputations:
    2
    ну спарси как многие - от начала до конца, а потом просто читай этот список в обратном порядке
     
  8. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Вот например:
    uses httpsend;

    Code:
    function Pars(T_, ForS, _T: string): string;
    var
      a, b,iu: integer;
    begin
    
      Result := '';
       for iu:=0 to Length(ForS)  do begin
      if (T_ = '') or (ForS = '') or (_T = '') then  Exit;
      a := Pos(T_, ForS);
      if a = 0 then    Exit
      else  a := a + Length(T_);
      ForS := Copy(ForS, a, Length(ForS) - a + 1);
      b := Pos(_T, ForS);
      if b > 0 then Result := Copy(ForS, 1, b - 1);
    end;
    end;
    
    procedure ishodniykod;
    var
    list:tstringlist;
    begin
    list:=tstringlist.create;
    HttpGetText('http://forum.antichat.ru', list);
    list.text:=(Pars('text-align:left;',list.text ,'</td>'));
    Showmessage(list.strings[1]);
    
    Всё таки от for iu:=0 to Length(ForS) do begin толк есть так как без него я всегда получаю только одну первую строку
     
  9. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Потом маленький вопрос у меня Chromium1.Browser.GetMainFrame.ExecuteJavaScript('text:input', ?,?); что обозначают данные параметры после text:input помеченные ?
     
    #9 triblekill, 8 Jan 2018
    Last edited: 8 Jan 2018
  10. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,481
    Reputations:
    25
    За названия переменных типа T_ и _T надо бить. Ногами. Даже если код предназначен для самого себя через 3 года ты нихера не поймешь что это такое и придется раздупляться.
    Код может быть только для примера но хорошая привычка она всегда пригодится.

    Этот код берет полностью текст сайтенга и ищет "вперед" при помощи pos. Вполне логичное решение. Если нужно искать с конца - есть функция SearchBuf. Она позволяет искать и в ту и в другую сторону.
    Но хорошей практикой считается все-таки разбиение структуры HTML. Так легче парсить потом (но для парсера на коленке - вполне сойдет и так).
     
    triblekill likes this.
  11. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,481
    Reputations:
    25
    Да... погуглил тут. Не знаю я такого компонента. Не моя специальность :)
    Ты вот что. У тебя где-то в Delphi можно посмотреть хидер. Может быть нужно нажать альт или контрол и навести крысой на этот метод. Там должно подчеркивание появиться. Нажимаешь - и у тебя описание чего туда вставлять. Если сам не разрулишь - пости что там. Должен быть вполне осмысленный текст. Из того что видел - второй параметр был "about:blank" что намекает на веб-страницу (возможно ошибки) а третий NULL все-таки.
     
  12. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,481
    Reputations:
    25
    А ДА !
    Главное чуть не забыл. Если хочешь писать парсеры - открой для себя "регулярные выражения" (не знаю какие юзать под Delphi) иначе ждет тебя много попоболи.
     
  13. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Да я знаю что регулярками можно просто что в регулярке что в функции одна проблема
     
  14. Bush

    Bush Member

    Joined:
    24 Feb 2013
    Messages:
    71
    Likes Received:
    12
    Reputations:
    0
    в чем проблема то?

    у меня на продажу есть библиотека .dll / модуль .pas/ с около 70 лучших функций для Delphi для работы с системой, интернетом, парсингом, клавиатурой, мышью, экраном и т.д., все разбито по разным классам для удобства, создание классов не требуется для вызова функций, оч. удобно все и для новичков и для профи.

    вот из модуля функция парсинга без регулярок:


    А когда строку спарсил просто ее переворачиваешь такой функцией:



    функции добавь в код и пиши
    Code:
    memo1.text:=ReverseStr( textsearch(memo1.text,'<a>','<td>'));
     
    triblekill likes this.
  15. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    276
    Likes Received:
    282
    Reputations:
    2
    ты либо StrUtils продаёшь? красавчик
     
  16. Bush

    Bush Member

    Joined:
    24 Feb 2013
    Messages:
    71
    Likes Received:
    12
    Reputations:
    0
    StrUtils? если бы..там нет функций парсинга.. ну reverse есть . это не из модуля функция) из модуля только первая.