Конференция "Сети" » Как же выдрать нужный кусочем 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 конечно же. как же еще
  • Lamer6666 (14.11.09 10:56) [20]
    Match и Replace не получается использовать одновременно, поэтому то и спрашивал как при переборе заменить найденные значения содержащиеся в Match[0]?
  • Медвежонок Пятачок © (14.11.09 17:17) [21]
    Найденное значение содежится в матче.
    Это тебе готовый новый экспрешшен для реплейса.
  • Медвежонок Пятачок © (14.11.09 19:46) [22]
    Ну или в конце концов у найденного матча есть матчпоз и матчлен.
  • Separator © (16.11.09 06:17) [23]
    Хернёй не страдайте, зачем давать бесполезные ответы, если человеку нужно определённое решение?

    Поищите в исходниках такую строку: TRegExprReplaceFunction
    Всё уже реализовано и можно реплайсить на динамическое значение
  • brother © (16.11.09 07:29) [24]
    добавлю одно но:
    все хорошо с заменой, если текст из [0] повторятся один раз, а если не один? ;)
    Вот еслиб

    > <table class="callstable"

    был бы уникальным и использовался один раз на странице (что врядли), вот тогда все гуд)
    зы делал подобное для сайта погоды... подводных камней - куча!
    Автору - удачи)
  • Медвежонок Пятачок © (16.11.09 09:07) [25]
    Поищите в исходниках такую строку: TRegExprReplaceFunction

    И чего?
    Чем она поможет, если ему все найденное надо приводить к дабл и умножать на два?
  • Separator © (23.11.09 06:50) [26]

    > Медвежонок Пятачок ©   (16.11.09 09:07) [25]
    >
    > И чего?

    А может стоило всё-таки разобраться?
    Вот исходная строка: n1sad n2dsa n3ds n4sd n5as
    Вот регулярное выражение: (n)([\d]+)
    А вот результат: n2sad n4dsa n6ds n8sd n10as
    Как видим задача решена полностью.
    Код решения:

    type
     TForm8 = class(TForm)
       btn1: TButton;
       mmo1: TMemo;
       edt1: TEdit;
       mmo2: TMemo;
       procedure btn1Click(Sender: TObject);
     private
       { Private declarations }
     public
       function RegE(aRegExpr : TRegExpr): string;
     end;

    var
     Form8: TForm8;

    implementation

    {$R *.dfm}

    { TForm8 }

    procedure TForm8.btn1Click(Sender: TObject);
    var
     mRegE: TRegExpr;
    begin
     mRegE := TRegExpr.Create;
     try
       mRegE.Expression := edt1.Text;
       mmo2.Lines.Add(mRegE.ReplaceEx(mmo1.Lines.Text, RegE));
     finally
       mRegE.Free;
     end;
    end;

    function TForm8.RegE(aRegExpr: TRegExpr): string;
    begin
     Result := aRegExpr.Match[1] + FloatToStr(StrToFloatDef(aRegExpr.Match[2], 0) * 2);
    end;

  • Separator © (23.11.09 07:01) [27]
    Вот честно, после всяких приведённых ответов на языке вертятся только неопределённые суффиксы: бля и мать вашу. Какого хрена не разобравшись даёте такие уверенные ответы? Исходники открыты, читайте, разбирайтесь и используйте.
  • Медвежонок Пятачок © (23.11.09 09:23) [28]
    Как видим задача решена полностью.

    не тормози, сникерсни.
    ему не просто найти надо, а заменить найденное на умноженное на два.
  • Медвежонок Пятачок © (23.11.09 09:32) [29]
    Допустим в исходном тексте есть '2' и '4'
    Обрабатываем '2' описанным выше образом и заменяем все го вхождения на '4'
    Затем встречаем в тексте '4', которое надо заменить на '8'.
    И тут понимаем, что кроме исходных '4' у нас появились '4' в результате предыдущего шага. А их менять не неадо.
  • Separator © (23.11.09 10:22) [30]
    Менять в обратном порядке: 4 на 8, 3 на 6, 2 на 4, 1 на 2, в чем проблема?
  • Медвежонок Пятачок © (23.11.09 10:28) [31]
    проблема в том, что порядок следования искомых чисел надо сначала где-т о взять
  • Separator © (23.11.09 10:40) [32]
    А где в постановке задачи были вообще такие условия? Может не стоит придумывать (додумывать) за автора вопроса? Я вроде написал, задача решена. В чём проблема? Подставте в мой пример рег. выражение данное автором и попробуйте запустить, уверяю вас, что всё отработает так как нужно и не будет ни каких левых замен.
    Давайте дождемся ответа автора вопроса? Если его не будет, значит он уже решил проблему, так что нечего плодить ответы.
  • Медвежонок Пятачок © (23.11.09 10:49) [33]
    А где в постановке задачи были вообще такие условия?

    Предлагаю, прежде чем петушиться и орать о найденном решении решении, подумать.

    А для начала найди в исходном тесте своим выражением самое большое число, с которого требутеся начать замену.
  • Медвежонок Пятачок © (23.11.09 10:56) [34]
    А где в постановке задачи были вообще такие условия?

    1.Выполняю запрос методом GET получаю в текстовую переменную

    2.как реализовать замену всех искомых сумм не на фиксированное значение '66.666', а на произведение например, то есть в место 0.001 получить везде 0.001*2?

    Итого: исходный текст заранее неизвестен.
    и в нем нужно искать числа и заменять их на функцию от найденного числа.

    Вот тебе и "а где в условии сказано"
  • Separator © (23.11.09 11:06) [35]
    Зачем искать самое большое число? Зачем производить множество замен? Функция ReplaceEx позволяет работать над каждым найденным значением отдельно и она продолжит искать по исходной строке, которая не подвергнется изменениям, пока не будет закончена вся замена, если заглянете в реализацию ReplcaeEx, то заметите, что там не производятся замены над исходной строкой, а результатом будет простое объединение не попадающих под выражение частей строки и результатов переданной функции.
    Вот ещё раз привожу пример работы:
    исходная  строка, куча цифр: 10 11 12 13 14 15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 1 2 3 4 5 6 7 8 9
    регулярное выражение: ([\d]+)
    результат, каждое найденное число умножено на 2: 20 22 24 26 28 30 32 34 36 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 2 4 6 8 10 12 14 16 18
    Никаких коллизий не обнаружено, каждое число как ему и полагалось, умножено на 2. Что еще требуется?
    вот код:

    procedure TForm8.btn1Click(Sender: TObject);
    var
    mRegE: TRegExpr;
    begin
    mRegE := TRegExpr.Create;
    try
      mRegE.Expression := edt1.Text;
      mmo2.Lines.Add(mRegE.ReplaceEx(mmo1.Lines.Text, RegE));
    finally
      mRegE.Free;
    end;
    end;

    function TForm8.RegE(aRegExpr: TRegExpr): string;
    begin
     Result := FloatToStr(StrToFloatDef(aRegExpr.Match[0], 0) * 2);
    end;

  • Separator © (23.11.09 11:07) [36]
    Вместо умножения на 2 можно производить любые действия над данным числом
  • Медвежонок Пятачок © (23.11.09 11:41) [37]
    ну и как же ты на очередной итерации замены "4" на "16" ты отсечешь четверки, которые есть результат уже свершившейся замены двоек на четверки?
  • Separator © (23.11.09 11:43) [38]
    Какая очередная итерация? Все делается за один проход!!!
 
Конференция "Сети" » Как же выдрать нужный кусочем html кода. [D7, WinXP]
Есть новые Нет новых   [134437   +30][b:0][p:0.003]