Конференция "Сети" » Как же выдрать нужный кусочем html кода. [D7, WinXP]
 
  • Lamer6666 (11.11.09 22:53) [0]
    Добрый вечер уважаемые.
    Выполняю запрос методом GET получаю в текстовую переменную S HTML код.
    Мне необходимо из всего HTML кода выдернуть табличку

    <table class="callstable" cellpadding="2" cellspacing="0"  width=500>
    <tr>
    <td style="border-bottom: 1px solid black; font-weight: bold;">Date</td><td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
      <td style="border-bottom: 1px solid black; font-weight: bold;">Time</td>
     
         
      <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
      <td style="text-align: left; border-bottom: 1px solid black; font-weight: bold;">Pole1</td>
      <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>

      <td style="text-align: left; border-bottom: 1px solid black; font-weight: bold;">Pole2</td>
      <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
      <td style="text-align: left; border-bottom: 1px solid black; font-weight: bold;">Pole3</td>
      <td style="border-bottom: 1px solid black; font-weight: bold;"> </td>
     </tr>

    Далее пошли строки <tr></tr> с данными.... для выше приведенных заголовков

    </table>

    и подкорректировать в ней данные....
    Кто сталкивался? Как реализовать?
    Спасибо и премного благодарен.
  • DVM © (12.11.09 00:28) [1]

    > Мне необходимо из всего HTML кода выдернуть табличку

    Pos() + Copy() - выдернуть можно все что угодно.
  • Separator © (12.11.09 12:53) [2]
    Советую использовать регулярные выражения, работают достаточно быстро. Очень сильно облегчают такие задачи.
    Качать с сайта http://www.regexpstudio.com/, но что-то он не работает, так что выкладываю у себя
    http://sergey.vilgelm.info/projects/delphi/regexp
  • Dennis I. Komarov © (12.11.09 15:45) [3]

    > и подкорректировать в ней данные....

    с какой целью?
    я к тому, что на сервере ничего не измениться...
  • Lamer6666 (13.11.09 00:08) [4]

    > Separator

    Да действительно удобно, единственное не могу понять как к коде:
       r := TRegExpr.Create;
       try
       r.Expression := 'ТУТ ВЫРОЖЕНИЕ';
       if r.Exec (S) then S:=r.Match [0];
       finally r.Free;
       end;


    перебрать все содержащиеся в тексте подстроки удовлетворяющие r.Expression, у меня r.Match [0]; содержит первое найденное?
    r.Match [1] ничего не содержит.... ((
  • Lamer6666 (13.11.09 00:28) [5]
    Прошу прощения за лишнее беспокойство, наткнулся:

         REPEAT
          r.Match [0]
         UNTIL not r.ExecNext;
  • Lamer6666 (13.11.09 00:54) [6]
    А вот этот вопрос не получилось решить....
    Как в
        REPEAT
         r.Match [0]
        UNTIL not r.ExecNext;


    заменить найденную строку r.Match [0] на свой текст, может средствами TRegExpr это можно сделать?
  • Separator © (13.11.09 05:42) [7]
    Там же есть функция Replace
  • Lamer6666 (13.11.09 09:03) [8]

    > Там же есть функция Replace

    Что то не могу понять как работает, Replace надо использовать отдельно от r.Exec? Или можно в цикле:
       REPEAT
        r.Match [0]
        r.Replace(r.Match [0],'то на что меняем')
       UNTIL not r.ExecNext;



    ??
  • Медвежонок Пятачок © (13.11.09 15:13) [9]
    Экспрешшен то перед реплэйсом поменять надо.
  • Separator © (13.11.09 15:14) [10]
    Использовать отдельно, без Exec
  • Медвежонок Пятачок © (13.11.09 15:14) [11]
    либо он весь мач поменяет разом.
    кроме того реплейс - это функция
  • Медвежонок Пятачок © (13.11.09 15:17) [12]
    либо вообще ничего не поменяет
    ибо внутри мача вполне может не оказаться ничего, что бъет с выражением по которому найден сам этот мач.
  • Lamer6666 (13.11.09 21:41) [13]
    Реализовал:
    r:=TRegExpr.Create;
     try
       r.Expression := ' [0-9]{1,}[.][0-9]{2}';
       S:=r.Replace(S,'66.666',false);
     finally
       r.free;
     end;


    Но не понимаю как реализовать замену всех искомых сумм не на фиксированное значение '66.666', а на произведение например, то есть в место 0.001 получить везде 0.001*2?
  • Медвежонок Пятачок © (14.11.09 01:03) [14]
    а что, проблема умножить найденную сумму (переведя ее сначала к double) на два и привести резалт обратно к строке для использования в реплейсе?
  • Lamer6666 (14.11.09 01:45) [15]

    > а что, проблема умножить найденную сумму (переведя ее сначала
    > к double) на два и привести резалт обратно к строке для
    > использования в реплейсе?
    >

    Это ясно, что переводить то? Как сослаться на эту сумму в коде:
    r:=TRegExpr.Create;
    try
      r.Expression := ' [0-9]{1,}[.][0-9]{2}';
      S:=r.Replace(S,'66.666',false);
    finally
      r.free;
    end;
    ?
  • Медвежонок Пятачок © (14.11.09 01:56) [16]
    Ну странный ты однако.
    Ты что вообще реплейсишь?
    По моему это переменная S.

    Ты спрашиваешь как сослаться на переменную?
  • Lamer6666 (14.11.09 02:00) [17]
    S содержит результат GET запроса.
    В S надо произвести арифметические операции над каждым числом вида [0-9]{1,}[.][0-9]{2}.
    Вот мне и надо не просто РЕПЛЕЙСИТЬ все такие значения, а РЕПЛЕЙСИТЬ из умноженными на 0,5 например. Как мне сослаться на каждую сумму типа  [0-9]{1,}[.][0-9]{2} для перевода ее в double?
  • Медвежонок Пятачок © (14.11.09 02:21) [18]
    ну так найди все вхождения подстрок - сумм.
    затем обработай.
  • Медвежонок Пятачок © (14.11.09 02:24) [19]
    Как мне сослаться на каждую сумму типа  [0-9]{1,}[.][0-9]{2} для перевода ее в double?

    через match конечно же. как же еще
 
Конференция "Сети" » Как же выдрать нужный кусочем html кода. [D7, WinXP]
Есть новые Нет новых   [134437   +30][b:0][p:0.001]