Форум: "Сети";
Текущий архив: 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.087 c