Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Как же выдрать нужный кусочем 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.068 c
15-1330181581
Pcrepair
2012-02-25 18:53
2013.03.22
TWebBrowser портит ссылки в коде страницы


15-1328787124
Медвежонок Пятачок
2012-02-09 15:32
2013.03.22
о старом....


2-1328101281
sergeii01
2012-02-01 17:01
2013.03.22
Запись в файл из нескольких потоков


1-1295947554
>|
2011-01-25 12:25
2013.03.22
Помогите с языковой конструкцией


15-1353344955
Пит
2012-11-19 21:09
2013.03.22
Delphi 7: неверное предупреждение компилятора





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский