Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.08.2010, 18:11
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию Парсинг HTML

Как с помощью Copy и Pos парсить html? Не могли бы привести пример?

Немного о задумке:
Хочу написать клиент для сайта, который будет проверять и выводить информацию. Программа обращается к PHP скрипту на сервере и получать страницу-ответ (с серверной частью и получением страницы проблем нет). Сначало хотел выдавать ответ в XML разметке, но работать с ним геморойно. Зачем нашел JSON, но в библиотеке для работы с ним на делфи не разобрался . Решил использовать свой велосипед на основе HTML. Разметка приблизительно такая:
Код:
<count>3</count>

<info0title>Заголовок0</info0title>
<info0text>Текст0</info0text>

<info1title>Заголовок1</info1title>
<info1text>Текст1</info1text>

<info2title>Заголовок2</info2title>
<info2text>Текст2</info2text>
Заранее спасибо!
Ответить с цитированием
  #2  
Старый 26.08.2010, 18:16
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

в принципе да, copy и pos вполне хватит...где-то у меня еще валялись готовые процедуры для парсинга..найду выложу
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #3  
Старый 26.08.2010, 19:48
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Цитата:
Сообщение от Ticksy
Как с помощью Copy и Pos парсить html? Не могли бы привести пример?

Немного о задумке:
Хочу написать клиент для сайта, который будет проверять и выводить информацию. Программа обращается к PHP скрипту на сервере и получать страницу-ответ (с серверной частью и получением страницы проблем нет). Сначало хотел выдавать ответ в XML разметке, но работать с ним геморойно. Зачем нашел JSON, но в библиотеке для работы с ним на делфи не разобрался . Решил использовать свой велосипед на основе HTML. Разметка приблизительно такая:
Код:
<count>3</count>

<info0title>Заголовок0</info0title>
<info0text>Текст0</info0text>

<info1title>Заголовок1</info1title>
<info1text>Текст1</info1text>

<info2title>Заголовок2</info2title>
<info2text>Текст2</info2text>
Заранее спасибо!
тебе обязательнто только ети функции использовать? может лутче стандартный парсер?
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #4  
Старый 26.08.2010, 20:10
aleksnine aleksnine вне форума
Начинающий
 
Регистрация: 08.03.2007
Сообщения: 151
Репутация: 12
По умолчанию

Код:
s:=copy(s,ansipos('>',s)+1,length(s));
s:=copy(s,0,ansipos('<',s)); 
Ответить с цитированием
  #5  
Старый 26.08.2010, 21:45
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию

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

aleksnine, не совсем понял код... если надо получить текст между <mytag>Текст, который нужно получить</mytag> то как ее записывать (получается толку от первой строки нет, вторая ее перекроет )?
Ответить с цитированием
  #6  
Старый 26.08.2010, 22:02
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Код:
s:='<count>3</count>';
if (pos('<count>',s)<>0)and(pos('</count>',s)<>0 ) then
begin
g:=inttostr(copy(s,pos('<count>',s),pos('</count>',s)-pos('<count>',s)));
end;

Чтото наподобе такого. код не проверял делал как говорится на коленке.
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #7  
Старый 27.08.2010, 00:57
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Забавная задачка, давно такой небыло. Вот такая забавка получилась:
Код:
  TSection = record
   Name, Value: String;
  end;

  TSectionArray = Array of TSection;

  TCustomParser = class
   fText: String;
   fSections: TSectionArray;
  private
   procedure SetText(const Value: String);
   function GetSectionCount: Integer;
  public
   property Text: String read fText write SetText;
   property Count: Integer read GetSectionCount;
   property Sections: TSectionArray read fSections write fSections;
   function GetSectionValue(Section: String): String;
  end;


{ TCustomParser }

function TCustomParser.GetSectionCount: Integer;
begin
 Result := Length(fSections);
end;

function TCustomParser.GetSectionValue(Section: String): String;
Var i: Integer;
begin
 for i := 0 to Length(fSections) - 1
 do if fSections[i].Name = Section
    then begin
         Result := fSections[i].Value;
         Break;
         end;
end;

procedure TCustomParser.SetText(const Value: String);
Var S: String;
begin
 fText := Value;
 S := Value;
 SetLength(fSections, 0);
 while Pos('<', S) > 0
 do begin
    SetLength(fSections, Length(fSections) + 1);
    Delete(S, 1, Pos('<', S));
    fSections[High(fSections)].Name := Copy(S, 1, Pos('>', S) - 1);
    Delete(S, 1, Pos('>', S));
    fSections[High(fSections)].Value := Copy(S, 1, Pos('</', S) - 1);
    Delete(S, 1, Pos('>', S));
    end;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 27.08.2010 в 00:59.
Ответить с цитированием
  #8  
Старый 27.08.2010, 16:05
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bars1992
Код:
s:='<count>3</count>';
if (pos('<count>',s)<>0)and(pos('</count>',s)<>0 ) then
begin
g:=inttostr(copy(s,pos('<count>',s),pos('</count>',s)-pos('<count>',s)));
end;

Чтото наподобе такого. код не проверял делал как говорится на коленке.
компилятор выдает:
[DCC Error] Unit1.pas(37): E2010 Incompatible types: 'HWND' and 'string'
Ответить с цитированием
  #9  
Старый 27.08.2010, 16:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Ругается на типы переменных. У вас какого типа переменные s и g?
И вы пробовали мой вариант?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 27.08.2010, 22:56
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

Ticksy попробуй сначала вариант страдальце у него больше опыта.
__________________
Не твори зла, и жизнь повернется к тебе передом
Ответить с цитированием
  #11  
Старый 30.08.2010, 20:21
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ругается на типы переменных. У вас какого типа переменные s и g?
И вы пробовали мой вариант?
Сейчас полностью скопировал ваш вариант, получилось:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var s : String;
var g : string;
begin
s:='<count>3</count>';
if (pos('<count>',s)<>0)and(pos('</count>',s)<>0 ) then
begin
g:=inttostr(copy(s,pos('<count>',s),pos('</count>',s)-pos('<count>',s)));
Edit1.Text := g;
end;
end;
При этом коде компилятор выдает: [DCC Error] Unit1.pas(33): E2250 There is no overloaded version of 'IntToStr' that can be called with these arguments
Среда: Delphi 2010

Если убрать функцию IntToStr, то в g пишется '<count>3' (без кавычек).
Ответить с цитированием
  #12  
Старый 30.08.2010, 21:57
Аватар для Bars1992
Bars1992 Bars1992 вне форума
Активный
 
Регистрация: 24.04.2010
Адрес: Украина, Кременчуг
Сообщения: 249
Репутация: 22
По умолчанию

щас подредактирую
PHP код:
procedure TForm1.Button1Click(SenderTObject);
var
s,g:string;
begin
s
:='<count>3</count>';
g:=copy(s,pos('<count>',s)+length('<count>'),pos('</count>',s)-pos('<count>',s)-length('<count>'));
showmessage(g);
s:='<info0title>Заголовок0</info0title>';
g:=copy(s,pos('<info0title>',s)+length('<info0title>'),pos('</info0title>',s)-pos('<info0title>',s)-length('<info0title>'));
showmessage(g);
end
__________________
Не твори зла, и жизнь повернется к тебе передом

Последний раз редактировалось Bars1992, 01.09.2010 в 22:05.
Ответить с цитированием
  #13  
Старый 01.09.2010, 17:22
Ticksy Ticksy вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 20
Репутация: 10
По умолчанию

Bars1992, спасибо! твой код работает
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025