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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2013, 12:38   #1
bender42
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 21
По умолчанию Парсер текста

Здравствуйте
Уважаемы кодеры помогите решить задачку так как сам с ней не в состоянии справится

есть html страница полученная через get запрос
так вот как мне из неё выдернуть нужный мне текст (не 1 строка а несколько)
работаю в потоке.

код который у меня получился

Он работает но иногда выдаёт всякую хрень тобич не то что должно быть
Код:
 Delete(g,1,pos('<ul id="userbar_list_3" class="jcarousel-skin-referal">',g)+length('<ul id="userbar_list_3" class="jcarousel-skin-referal">'));
        g:=copy(g,1,pos('</ul>',g)-1);
          sRez := '';
            s := output1;
              isTag := false;
           for i:=1 to Length(s) do begin
              if s[i]='" style="' then isTag := true
          else begin
              if not isTag then sRez := sRez + s[i]
                      else
                  if s[i]='ublink=' then begin sRez := sRez + ' '; isTag := false;
                  output1:= sRez;
             end;
         end;
      end;
bender42 вне форума Ответить с цитированием
Старый 28.04.2013, 13:49   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вы бы еще привели кусок текста, парсинг которого необходим, а то разбираться с Вашей реализацией, которая к тому же не всегда срабатывает, совершенно не хочется.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.04.2013, 14:08   #3
bender42
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы бы еще привели кусок текста, парсинг которого необходим, а то разбираться с Вашей реализацией, которая к тому же не всегда срабатывает, совершенно не хочется.
Код:
<ul id="userbar_list_3" class="jcarousel-skin-referal">
								<li ublink="/userbar/bar.jpg" style="background-image: url(/userbar//bar.jpg)"></li><li ublink="/userbar/bar.jpg" style="background-image: url(/userbar/bar.jpg)"></li>
							</ul>
Вот от сюда мне нужно спарсить "/userbar/bar.jpg"

Последний раз редактировалось bender42; 28.04.2013 в 14:10.
bender42 вне форума Ответить с цитированием
Старый 28.04.2013, 14:20   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
uses StrUtils;
...
function extract(const text, begin1, end1: string): string;
var
  startpos, endpos: integer;
begin
  result := '';
  startpos := Pos(begin1, text);
  if startpos < 1 then
    exit;
  inc(startpos, length(begin1));
  endpos := PosEx(end1, text, startpos);
  if endpos < 1 then
    exit;
  result := Copy(text, startpos, endpos - startpos);
end;
...
showmessage(extract(text, 'ublink=', ' style='));
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.04.2013, 15:44   #5
bender42
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
uses StrUtils;
...
function extract(const text, begin1, end1: string): string;
var
  startpos, endpos: integer;
begin
  result := '';
  startpos := Pos(begin1, text);
  if startpos < 1 then
    exit;
  inc(startpos, length(begin1));
  endpos := PosEx(end1, text, startpos);
  if endpos < 1 then
    exit;
  result := Copy(text, startpos, endpos - startpos);
end;
...
showmessage(extract(text, 'ublink=', ' style='));
к сожалению ругается на "uses StrUtils;"

извиняюсь она у меня уже объявлена была)

к сожалению он парсит только 1 строку из 0-20 =(

Последний раз редактировалось bender42; 28.04.2013 в 15:58.
bender42 вне форума Ответить с цитированием
Старый 28.04.2013, 16:00   #6
Eo0le
 
Аватар для Eo0le
 
Регистрация: 28.04.2013
Сообщений: 8
По умолчанию

Цитата:
к сожалению он парсит только 1 строку из 0-20 =(
Используйте цикл.
C++ (WinAPI) & PHP & Asm & Java & Python & HTML/CSS/JS & NTLDR
Eo0le вне форума Ответить с цитированием
Старый 28.04.2013, 16:16   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Тогда нужно использовать чуть другую реализацию:
Код:
function extract(const text, begin1, end1: string; var Pos1: integer): string;
  overload;
var
  startpos, endpos: integer;
begin
  result := '';
  startpos := PosEx(begin1, text, Pos1);
  if startpos < 1 then
  begin
    Pos1 := -1;
    exit;
  end;
  inc(startpos, length(begin1));
  endpos := PosEx(end1, text, startpos);
  if endpos < 1 then
  begin
    Pos1 := -1;
    exit;
  end;
  Pos1 := endpos + length(end1);
  result := Copy(text, startpos, endpos - startpos);
end;
...
st := tstringlist.Create;
j := 1;
tmp := extract(text, 'ublink=', ' style=', j);
while j <> -1 do
begin
  st.Append(tmp);
  tmp := extract(text, 'ublink=', ' style=', j);
end;
showmessage(st.text);
st.destroy;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.04.2013, 16:49   #8
bender42
Пользователь
 
Регистрация: 21.07.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Тогда нужно использовать чуть другую реализацию:
Код:
function extract(const text, begin1, end1: string; var Pos1: integer): string;
  overload;
var
  startpos, endpos: integer;
begin
  result := '';
  startpos := PosEx(begin1, text, Pos1);
  if startpos < 1 then
  begin
    Pos1 := -1;
    exit;
  end;
  inc(startpos, length(begin1));
  endpos := PosEx(end1, text, startpos);
  if endpos < 1 then
  begin
    Pos1 := -1;
    exit;
  end;
  Pos1 := endpos + length(end1);
  result := Copy(text, startpos, endpos - startpos);
end;
...
st := tstringlist.Create;
j := 1;
tmp := extract(text, 'ublink=', ' style=', j);
while j <> -1 do
begin
  st.Append(tmp);
  tmp := extract(text, 'ublink=', ' style=', j);
end;
showmessage(st.text);
st.destroy;
Спасибо помогло)

Последний раз редактировалось bender42; 28.04.2013 в 16:56.
bender42 вне форума Ответить с цитированием
Старый 28.04.2013, 16:59   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Попробуйте так:
Код:
j := 1;
tmp := extract(text, 'ublink=', ' style=', j);
while j <> -1 do
begin
  st.Append(tmp);
  j := PosEx('</ul>', text, j);
  if j > 0 then
    tmp := extract(text, 'ublink=', ' style=', j);
end;
А вообще, это гадание по кофейной гущей (я же не вижу всего текста и точно не знаю, что и в каком количестве нужно получить).
Или так:
Код:
function extract(const text, begin1, end1, next1: string; var Pos1: integer): string;
  overload;
var
  startpos, endpos: integer;
begin
  result := '';
  startpos := PosEx(begin1, text, Pos1);
  if startpos < 1 then
  begin
    Pos1 := -1;
    exit;
  end;
  inc(startpos, length(begin1));
  endpos := PosEx(end1, text, startpos);
  if endpos < 1 then
  begin
    Pos1 := -1;
    exit;
  end;
  Pos1 := endpos + length(end1);
  Pos1 := PosEx(next1, text, Pos1);
  result := Copy(text, startpos, endpos - startpos);
end;
...
st := tstringlist.Create;
j := 1;
tmp := extract(text, 'ublink=', ' style=', '</ul>', j);
while j <> -1 do
begin
  st.Append(tmp);
  tmp := extract(text, 'ublink=', ' style=', '</ul>', j);
end;
showmessage(st.text);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.04.2013, 21:26   #10
ingushmen
Пользователь
 
Аватар для ingushmen
 
Регистрация: 13.11.2010
Сообщений: 13
По умолчанию

Код:
procedure parser(html:string); //Процедура для парсинга кода
begin
//HTML - сам исходный код который вносится в переменную
while Pos('href="', html) <> 0 do 
begin

Delete(html, 1, Pos('href="', html) + Length('href="') - 1);
Form1.Memo1.Lines.Add(Copy(html, 1, Pos('"', html) - 1));

Application.ProcessMessages;
end;
end;
Всё просто и легко. Парсим и удаляем из HTML то, что спарсили, дабы потом не парсить одно и то же.
ingushmen вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсер qiperman Работа с сетью в Delphi 4 29.04.2013 22:16
парсер god5 Работа с сетью в Delphi 10 29.12.2012 20:53
Ещё один вопрос про парсер текста elagin Общие вопросы Delphi 5 31.05.2012 18:49
Парсер cargo29 PHP 15 11.08.2011 21:16
Парсер Ronin333 Общие вопросы C/C++ 3 15.04.2010 14:00