Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Как же выдрать нужный кусочем html кода.   Найти похожие ветки 

 
Lamer6666   (2009-11-11 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 ©   (2009-11-12 00:28) [1]


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

Pos() + Copy() - выдернуть можно все что угодно.


 
Separator ©   (2009-11-12 12:53) [2]

Советую использовать регулярные выражения, работают достаточно быстро. Очень сильно облегчают такие задачи.
Качать с сайта http://www.regexpstudio.com/, но что-то он не работает, так что выкладываю у себя
http://sergey.vilgelm.info/projects/delphi/regexp


 
Dennis I. Komarov ©   (2009-11-12 15:45) [3]


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

с какой целью?
я к тому, что на сервере ничего не измениться...


 
Lamer6666   (2009-11-13 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   (2009-11-13 00:28) [5]

Прошу прощения за лишнее беспокойство, наткнулся:

     REPEAT
      r.Match [0]
     UNTIL not r.ExecNext;


 
Lamer6666   (2009-11-13 00:54) [6]

А вот этот вопрос не получилось решить....
Как в
    REPEAT
     r.Match [0]
    UNTIL not r.ExecNext;

заменить найденную строку r.Match [0] на свой текст, может средствами TRegExpr это можно сделать?


 
Separator ©   (2009-11-13 05:42) [7]

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


 
Lamer6666   (2009-11-13 09:03) [8]


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

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


??


 
Медвежонок Пятачок ©   (2009-11-13 15:13) [9]

Экспрешшен то перед реплэйсом поменять надо.


 
Separator ©   (2009-11-13 15:14) [10]

Использовать отдельно, без Exec


 
Медвежонок Пятачок ©   (2009-11-13 15:14) [11]

либо он весь мач поменяет разом.
кроме того реплейс - это функция


 
Медвежонок Пятачок ©   (2009-11-13 15:17) [12]

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


 
Lamer6666   (2009-11-13 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?


 
Медвежонок Пятачок ©   (2009-11-14 01:03) [14]

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


 
Lamer6666   (2009-11-14 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;
?


 
Медвежонок Пятачок ©   (2009-11-14 01:56) [16]

Ну странный ты однако.
Ты что вообще реплейсишь?
По моему это переменная S.

Ты спрашиваешь как сослаться на переменную?


 
Lamer6666   (2009-11-14 02:00) [17]

S содержит результат GET запроса.
В S надо произвести арифметические операции над каждым числом вида [0-9]{1,}[.][0-9]{2}.
Вот мне и надо не просто РЕПЛЕЙСИТЬ все такие значения, а РЕПЛЕЙСИТЬ из умноженными на 0,5 например. Как мне сослаться на каждую сумму типа  [0-9]{1,}[.][0-9]{2} для перевода ее в double?


 
Медвежонок Пятачок ©   (2009-11-14 02:21) [18]

ну так найди все вхождения подстрок - сумм.
затем обработай.


 
Медвежонок Пятачок ©   (2009-11-14 02:24) [19]

Как мне сослаться на каждую сумму типа  [0-9]{1,}[.][0-9]{2} для перевода ее в double?

через match конечно же. как же еще


 
Lamer6666   (2009-11-14 10:56) [20]

Match и Replace не получается использовать одновременно, поэтому то и спрашивал как при переборе заменить найденные значения содержащиеся в Match[0]?


 
Медвежонок Пятачок ©   (2009-11-14 17:17) [21]

Найденное значение содежится в матче.
Это тебе готовый новый экспрешшен для реплейса.


 
Медвежонок Пятачок ©   (2009-11-14 19:46) [22]

Ну или в конце концов у найденного матча есть матчпоз и матчлен.


 
Separator ©   (2009-11-16 06:17) [23]

Хернёй не страдайте, зачем давать бесполезные ответы, если человеку нужно определённое решение?

Поищите в исходниках такую строку: TRegExprReplaceFunction
Всё уже реализовано и можно реплайсить на динамическое значение


 
brother ©   (2009-11-16 07:29) [24]

добавлю одно но:
все хорошо с заменой, если текст из [0] повторятся один раз, а если не один? ;)
Вот еслиб

> <table class="callstable"

был бы уникальным и использовался один раз на странице (что врядли), вот тогда все гуд)
зы делал подобное для сайта погоды... подводных камней - куча!
Автору - удачи)


 
Медвежонок Пятачок ©   (2009-11-16 09:07) [25]

Поищите в исходниках такую строку: TRegExprReplaceFunction

И чего?
Чем она поможет, если ему все найденное надо приводить к дабл и умножать на два?


 
Separator ©   (2009-11-23 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 ©   (2009-11-23 07:01) [27]

Вот честно, после всяких приведённых ответов на языке вертятся только неопределённые суффиксы: бля и мать вашу. Какого хрена не разобравшись даёте такие уверенные ответы? Исходники открыты, читайте, разбирайтесь и используйте.


 
Медвежонок Пятачок ©   (2009-11-23 09:23) [28]

Как видим задача решена полностью.

не тормози, сникерсни.
ему не просто найти надо, а заменить найденное на умноженное на два.


 
Медвежонок Пятачок ©   (2009-11-23 09:32) [29]

Допустим в исходном тексте есть "2" и "4"
Обрабатываем "2" описанным выше образом и заменяем все го вхождения на "4"
Затем встречаем в тексте "4", которое надо заменить на "8".
И тут понимаем, что кроме исходных "4" у нас появились "4" в результате предыдущего шага. А их менять не неадо.


 
Separator ©   (2009-11-23 10:22) [30]

Менять в обратном порядке: 4 на 8, 3 на 6, 2 на 4, 1 на 2, в чем проблема?


 
Медвежонок Пятачок ©   (2009-11-23 10:28) [31]

проблема в том, что порядок следования искомых чисел надо сначала где-т о взять


 
Separator ©   (2009-11-23 10:40) [32]

А где в постановке задачи были вообще такие условия? Может не стоит придумывать (додумывать) за автора вопроса? Я вроде написал, задача решена. В чём проблема? Подставте в мой пример рег. выражение данное автором и попробуйте запустить, уверяю вас, что всё отработает так как нужно и не будет ни каких левых замен.
Давайте дождемся ответа автора вопроса? Если его не будет, значит он уже решил проблему, так что нечего плодить ответы.


 
Медвежонок Пятачок ©   (2009-11-23 10:49) [33]

А где в постановке задачи были вообще такие условия?

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

А для начала найди в исходном тесте своим выражением самое большое число, с которого требутеся начать замену.


 
Медвежонок Пятачок ©   (2009-11-23 10:56) [34]

А где в постановке задачи были вообще такие условия?

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

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

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

Вот тебе и "а где в условии сказано"


 
Separator ©   (2009-11-23 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 ©   (2009-11-23 11:07) [36]

Вместо умножения на 2 можно производить любые действия над данным числом


 
Медвежонок Пятачок ©   (2009-11-23 11:41) [37]

ну и как же ты на очередной итерации замены "4" на "16" ты отсечешь четверки, которые есть результат уже свершившейся замены двоек на четверки?


 
Separator ©   (2009-11-23 11:43) [38]

Какая очередная итерация? Все делается за один проход!!!



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.266 c
15-1353950365
Разведка
2012-11-26 21:19
2013.03.22
Проблема принтера для чеков VKP-80-II


15-1342693823
.dmitry
2012-07-19 14:30
2013.03.22
Произошел сбой программе инициализации библиотеки динамической ко


2-1343328927
Alez
2012-07-26 22:55
2013.03.22
Microsoft OneNote


2-1334127903
Gimbomba
2012-04-11 11:05
2013.03.22
Проблема с bde table в Embarcadero Delhpi XE2


9-1192647962
Ricks
2007-10-17 23:06
2013.03.22
Screen-aligned quad