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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 08.02.2014, 05:24   #1
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
Вопрос Вобщем проблема опять...

Вобщем проблема следующая:

Есть несколько страниц с которых нужно парсить текст, количество указывается в SpinEdit, и бывает что я указываю слишком много страниц чем есть на самом деле и получается что счетчик (integer) работает в "холостую", или выдает дубликаты, как можно реализовать корректную работу программы?

Пример кода:
Код:
var
i:integer;
RegExp:TRegExpr;
begin
RegExp:=TRegExpr.Create;
RegExp.Expression:='от(.*?)до';
for i:=0 to Form1.SpinEdit1.Value-1 do // в SpinEdit - количество страниц
begin
//запрос откуда парсить будем

if RegExp.Exec('тут переменная запроса') then
begin
repeat
Form1.sRichEdit1.Lines.Add(RegExp.Match[1]);
until not RegExp.ExecNext;
end;
end;

RegExp.Free;
end;
В итоге бывает и 1 слово на странице которое нужно спарсить, и я не зная этого указываю слишком больше количество, как быть?

В голову пришло только это:
Попробовать спарсить количество страниц с запроса, это геморно в плане парсинга но количество страничек отображается и их можно достать но без танцев с бубном не обойдется, и подставлять число страниц автоматом вместо SpinEdit...

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

Код:
<a href="page=1">2</a>
<a href="page=2">3</a>
<a href="page=3">4</a>
Может кто-то что-то посоветовать, или рассказать как правильно реализовать такое?

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

Код:
uses
  RegExpr in 'RegExpr.pas';

procedure Parse(const text:string; Count:Integer);
var
  i,j:integer;
  RegExp:TRegExpr;
begin
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='[0-9]';
  for i:=0 to Count-1 do
  begin
    if RegExp.Exec(text) then
    repeat
      if RegExp.Match[i] = '' then
      begin
        RegExp.Destroy;
        Exit;
      end;
      Write(RegExp.Match[i],' .');
    until not RegExp.ExecNext;
  end;
  RegExp.Destroy; // не Free;
end;

begin
  Parse('16549498449',999);
пыжок

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

Цитата:
Сообщение от maloun Посмотреть сообщение
Код:
uses
  RegExpr in 'RegExpr.pas';

procedure Parse(text:string; Count:Integer);
var
  i,j:integer;
  RegExp:TRegExpr;
begin
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='[0-9]';
  for i:=0 to Count-1 do
  begin
    if RegExp.Exec(text) then
      repeat
        Write(RegExp.Match[i],' ');
      until not RegExp.ExecNext
    else
    Break;
  end;
  RegExp.Destroy; // не Free;
end;

begin
  Parse('16549498449',999);
немного подробнее можно?
FleXik вне форума
Старый 08.02.2014, 06:43   #4
maloun
Форумчанин
 
Аватар для maloun
 
Регистрация: 03.01.2011
Сообщений: 233
По умолчанию

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

Цитата:
Сообщение от maloun Посмотреть сообщение
поправил код, суть в том чтобы прекращать выводить результаты если они кончились
спасибо большое, сейчас попробую
FleXik вне форума
Старый 08.02.2014, 09:13   #6
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

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

в Count грузить список страниц? если да - придется парсить количество этих страниц (т.е число сколько их, т.к для каждой страницы отправляется запрос т.е запросов много а не один) каждый раз... и тогда в принципе можно обойтись и обычным циклом + будет срабатывать RegExp.ExecNext, или я не прав?

Код:
for i:=0 to 'количество спаршенных страниц' do
begin
// парсим слова со страниц
end;

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

щас поправлю код
Код:
procedure parse(Strings:Array of String);
var
  i:integer;
  RegExp: TRegExpr;
begin
  RegExp:=TRegExpr.Create;
  RegExp.Expression:='[0-9]';
  for i:=0 to Length(Strings)-1 do
  begin
    if RegExp.Exec(Strings[i]) then
    repeat
      write(RegExp.Match[0]);
    until not RegExp.ExecNext;
    writeln('');
  end;
  RegExp.Destroy;
end;

const
  pages:Array[0..2] of String = (
    '2345678901',
    '0123456789',
    '3456789012'
  );

begin
  Parse(pages);
  readln;
end.
теперь процедура, принимает все страницы, не знаю что может пойти не так
пыжок

Последний раз редактировалось maloun; 08.02.2014 в 10:18.
maloun вне форума
Старый 08.02.2014, 10:03   #8
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

по конкретней можно? можно остановить цикл, если регулярка не сработала, например.
Кольша вне форума
Старый 08.02.2014, 10:27   #9
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Кольша, например, есть 3 html страницы: 1.html, 2.html, 3.html (в действительности разное количество)

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

Код:
for i:=0 to 2 do begin
но в действительности каждый раз я получаю разное количество html страниц и я не могу угадать их количество соотстветсвенно может быть одна страница а цикл у меня будет:

Код:
for i:=0 to 50 do begin
тогда получается что парсить одну и ту же страницу будет 50 раз (1 страница должна парсится только 1 раз), пока цикл не дойдет до конца, мне же нужно останавливать цикл если спарсило все значения но при этом изначально логично было-бы парсить с исходного кода страницы количество html страниц с которых будут парситься слова тогда можно будет исключить в цикле лишние "разы"

в итоге код должен выглядеть примерно так:

Код:
var
s:string;
i:integer;
begin
s:=parser('где парсим', 'откуда парсим', 'докуда парсим') // короче в эту переменную должно парсится
 количество страниц которые мне выдает поиск на сайте
for i:=0 to StrToInt(s) do begin // т.е получается что мы знаем сколько страниц выдал поиск и если выдаст 
даже 1 страницу то переменная подставит именно цифру один и цикл не будет проходить 49 лишних раз
а бывает что страниц больше чем я указываю поэтому логично было бы парсить то количество страниц (количество только суммарное число, не сами ссылки, просто число например 137) которое мне выдает поиск, тогда я смогу спарсить 100% слов

возможно кто-то может предложить свои методы решения проблемы

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

как вы получаете страницы?
вам нужно их разделять и присылать в функцию количество страниц
пыжок
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