Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 08.02.2014, 10:36   #11
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

Цитата:
Сообщение от FleXik Посмотреть сообщение
мне же нужно останавливать цикл если спарсило все значения
так и проверяйте
Код:
procedure parse(Strings:Array of String);
var
  i,j,Matches:integer;
  RegExp: TRegExpr;
label
  EndLoop;
begin
  Matches:=0;
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='[0-9]';
  for i:=0 to Length(Strings)-1 do
  begin
    if RegExp.Exec(Strings[i]) then
    repeat
      for j:=0 to RegExp.MatchLen[0]-1 do
      if RegExp.Match[j] = '1' then
      begin
        Write(1);
        Inc(Matches);
        if Matches = 3 then goto EndLoop;
      end;
      //write(RegExp.Match[0]);

    until not RegExp.ExecNext;
    writeln('');
  end;
EndLoop:
  RegExp.Destroy;
end;

const
  pages:Array[0..2] of String = (
    '234567811901',
    '0123411567819',
    '345678119012'
  );

begin
  Parse(pages);
  readln;
end.
пыжок
maloun вне форума
Старый 08.02.2014, 10:37   #12
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от maloun Посмотреть сообщение
как вы получаете страницы?
вам нужно их разделять и присылать в функцию количество страниц
вот, я и написал в первом посте темы что и откуда мне нужно парсить, так вот только спарсить не получается, я даже не знаю с какой стороны подходить


maloun, мне сложно разобраться в чужом коде, уж тем более мне не понятно что для чего нужно.

P.S сам текст я паршу нормально но только если в цикле не перебор, если страниц в цикле указано столько сколько мне выдает поиск то парсится идеально, если страниц меньше чем указано в цикл или больше чем указано в цикле - начинаются проблемы.

Вот ниже код, таким образом в исходном коде позначаются страницы который выдал поиск по определенному запросу, количество страниц всегда меняется и парсить нужно именно последнюю цифру, в примере ниже последняя цифра (она же последняя страница) - 4
Код:
<a href="page=1">2</a>
<a href="page=2">3</a>
<a href="page=3">4</a>
кто не читал - читайте предыдущую страницу темы, последний пост, там я максимально подробно рассказал, если не понятно обьяснил - напишите в теме - попробую еще более детальнее обьяснить

Последний раз редактировалось FleXik; 08.02.2014 в 10:46.
FleXik вне форума
Старый 08.02.2014, 10:47   #13
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

Цитата:
Сообщение от FleXik Посмотреть сообщение
maloun, мне сложно разобраться в чужом коде, уж тем более мне не понятно что для чего нужно.
ладно, все по порядку

1. вы откуда-то получаете страницы, значит как минимум тот кто их выдал знал сколько их было.
2. если вы хотите парсить НЕ ВСЕ страницы, берете мой код
и по отпаршеным значениям смотрите
Код:
     for j:=0 to RegExp.MatchLen[0]-1 do
      if RegExp.Match[j] = '1' then    // если значение равно искомому "1"
      begin
        Write(1);
        Inc(Matches);        // увеличиваем счетчик искомых ответов
        if Matches = 3 then goto EndLoop;   // когда счетчик достигает лимита - выходим
      end;
3. если у вас страниц больше чем вы подумали, нужен в первую очередь алгоритм определения количества страниц

и вообще, как можно не знать количество страниц
пыжок
maloun вне форума
Старый 08.02.2014, 10:53   #14
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Код:
3. если у вас страниц больше чем вы подумали, нужен в первую очередь алгоритм определения количества страниц
так я же говорю что нужно спарсить количество страниц который я получаю в исходном коде, выше я уже 2 раза писал что и откуда надо парсить (красным цветом выделено)

а как можно знать количество? страницы всмысле на сайте, такого рода


я отсылаю каждый раз разный запрос, с 1 запроса я получаю 1-1000 страниц как на скриншоте выше, вручную через браузер я могу определить сколько страниц мне выдал поиск, но не буду же я каждый раз сидеть и узнавать сколько страниц выдал поиск чтобы их указать в цикле?
Изображения
Тип файла: jpg Безымянный7.jpg (3.2 Кб, 59 просмотров)
FleXik вне форума
Старый 08.02.2014, 10:54   #15
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

Цитата:
Сообщение от FleXik Посмотреть сообщение
Код:
<a href="page=1">2</a>
<a href="page=2">3</a>
<a href="page=3">4</a>
ну вот и парсите так:
1. проходимся в цикле по тексту
2. нашли строку типа <a href="page=2">3</a>
3. записали в массив, запомнили её индекс в массиве в переменную max и значение 3 в переменную value, предварительно сравнив индекс и значения с уже существующим
5. после завершения цикла берем максимальную страницу и работаем с ней
пыжок
maloun вне форума
Старый 08.02.2014, 10:57   #16
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от maloun Посмотреть сообщение
ну вот и парсите так:
1. проходимся в цикле по тексту
2. нашли строку типа <a href="page=2">3</a>
3. записали в массив, запомнили её индекс в массиве в переменную max и значение 3 в переменную value, предварительно сравнив индекс и значения с уже существующим
5. после завершения цикла берем максимальную страницу и работаем с ней
ну вот мы и пришли к финишу, я не знаю как это можно реализовать, конечно может и другие способы есть или идеи как можно парсить правильно не зная сколько страниц выдаст поиск, а выдает он каждый раз разное количество...


мне просто нужно парсить всё, а не зная сколько страниц выдал поиск как мне кажется спарсить всё не реально...


может в принципе это и возможно но не хочется наугад ставить т.к

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

Код:
for i:=0 to 1000 do begin
IdHTTP1.GET('http://site.ru/page' + IntToStr(i));
2. если поиск выдает страниц больше чем указано в цикле - спарсятся не всё, а мне нужно парсить всё...

Последний раз редактировалось FleXik; 08.02.2014 в 11:04.
FleXik вне форума
Старый 08.02.2014, 11:02   #17
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

Цитата:
Сообщение от FleXik Посмотреть сообщение
мне просто нужно парсить всё, а не зная сколько страниц выдал поиск как мне кажется спарсить всё не реально...
прежде чем парсить "всё", отпарситье хотябы то что есть на предмет количества страниц)

Код:
for i:=0 to 1000 do 
begin
  IdHTTP1.GET('http://site.ru/page' + IntToStr(i));
  // тогда вот тут вам нужно поставить трай эксцепт
  try
    IdHTTP1.GET('http://site.ru/page' + IntToStr(i));
    // тут парсим страницу, получаем ейный нормер, парсим её в рекорд\строку 
    // кладем отпаршеную инфу в массив
    // увеличиваем счетчик максимальной страницы с индексом нашей инфы о странице
  except
    Break;
  end;
end;
// вот тут достаем по индексу последнюю страницу 
// или просто используем длинну получившегося массива как количество страниц
пыжок

Последний раз редактировалось maloun; 08.02.2014 в 11:10.
maloun вне форума
Старый 08.02.2014, 11:07   #18
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Сообщение от maloun Посмотреть сообщение
прежде чем парсить "всё", отпарситье хотябы то что есть на предмет количества страниц)

скажите в каком виде вы получаете страницы и как парсите одну страницу
в 1 сообщение темы код с использованием RegExpr - так и паршу.
а как я отпаршу количество страниц если там без танца с бубном не обойтись? там повторяются части исходного кода и не так-то легко спарсить последнюю цифру (последняя цифра и является количеством) выше я уже не один раз давал исходный код где находится количество страниц (красным выделял, вы еще цитировали это сообщение)

Если все так просто, вытащите пожалуйста мне последнюю из кода ниже, красным выделены числа которые надо парсить

причем чтобы было не 3 строки как этом примере а каждый раз разное количество строк и чтобы всегда парсилась последнее число

Код:
<a href="page=1">2</a>
<a href="page=2">3</a>
<a href="page=3">4</a>
---------------------------------------------
<a href="page=1">2</a>
<a href="page=2">3</a>
<a href="page=3">4</a>
<a href="page=4">5</a>
<a href="page=5">6</a>
<a href="page=6">7</a>
<a href="page=7">8</a>
----------------------------------------------
<a href="page=1">2</a>
<a href="page=2">3</a>
<a href="page=3">4</a>
<a href="page=4">5</a>
----------------------------------------------
<a href="page=1">2</a>
<a href="page=2">3</a>
<a href="page=3">4</a>
<a href="page=4">5</a>
<a href="page=5">6</a>
<a href="page=6">7</a>
<a href="page=7">8</a>
<a href="page=8">9</a>
<a href="page=9">10</a>
конечно ваша идея парсить по-очереди и записывать в массив и с массива уже узнавать какая последняя цифра, но я не знаю как должен выглядеть код, я обычно RegExpr использую или функцию парсинга самую простую..

Последний раз редактировалось FleXik; 08.02.2014 в 11:13.
FleXik вне форума
Старый 08.02.2014, 11:20   #19
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

maloun, это вообще не то (я про ваш код выше), зачем отсылать запрос до try и после? достаточно запрос кинуть в цикл, в цикле указать переменную в которую спарсить количество страниц, в запросе будет подставляться индекс счетчика, счетчиком и будет номер страницы... выглядеть это должно так

Код:
var
s:string;
i:integer;
begin
s:='в эту переменную надо спарсить количество страниц (т.е числом а не ссылками)';
for i:=0 to IntToStr(s) do begin
IdHTTP1.GET('http://site.ru/page-' + IntToStr(i));
//парсим нужные мне данные, тут я уже сам
end;
например допустим что s:=23;
в итоге получается что цикл отправит 23 запроса:
Код:
http://site.ru/page-1
http://site.ru/page-2
http://site.ru/page-3
http://site.ru/page-4
http://site.ru/page-5
http://site.ru/page-6
http://site.ru/page-7
http://site.ru/page-8
http://site.ru/page-9
http://site.ru/page-10
http://site.ru/page-11
http://site.ru/page-12
http://site.ru/page-13
http://site.ru/page-14
http://site.ru/page-15
http://site.ru/page-16
http://site.ru/page-17
http://site.ru/page-18
http://site.ru/page-19
http://site.ru/page-20
http://site.ru/page-21
http://site.ru/page-22
http://site.ru/page-23
а с кажого такого запроса я паршу нужные мне данные...

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

Последний раз редактировалось FleXik; 08.02.2014 в 11:25.
FleXik вне форума
Старый 08.02.2014, 11:36   #20
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

вот простейший парс
Вложения
Тип файла: rar example.rar (3.0 Кб, 25 просмотров)
пыжок
maloun вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вобщем...защитился :) spamer Свободное общение 48 21.06.2013 01:39
И опять у меня проблема... Alex009 Общие вопросы C/C++ 17 10.03.2013 14:32
И опять проблема с хуками. Приложение само закрывается Altera Win Api 10 16.03.2010 19:39
Это опять я, проблема вывода график на рисунок. Bilargo Помощь студентам 14 27.10.2009 11:18