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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2012, 10:33   #41
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Решил отказаться от идеи парсить html сильно сложно всё там
вот взял xml

http://xml.weather.co.ua/1.2/forecas...d=yoursite_com

как его разобрать уже понял только одна проблема

есть кусок кода который повторяеться 20 раз

вот сам кусок

Код:
if (ForecastNode.ChildNodes[lin].Attributes['date']= FormatDateTime('yyyy-mm-dd', date))and
         (ForecastNode.ChildNodes[lin].Attributes['hour']='3') then
        begin
          //íàøëè óçåë - âûâîäèì çíà÷åíèÿ íà ôîðìó

         pict1[2]:= ForecastNode.ChildNodes[lin].ChildValues['pict'] ;
         ppcp[1] :=ForecastNode.ChildNodes[lin].ChildValues['ppcp'] ;
         t_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['t'].ChildValues['min'];
         t_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['t'].ChildValues['max'];

         p_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['p'].ChildValues['min'];
         p_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['p'].ChildValues['max'];

         wind_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['min'];
         wind_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['max'];
         wind_rumb[1]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['rumb'];

         hmid_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['hmid'].ChildValues['min'];
         hmid_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['hmid'].ChildValues['max'];

         wpi[1]:= ForecastNode.ChildNodes[lin].ChildValues['wpi'] ;
          end;
В нем изменяеться
FormatDateTime('yyyy-mm-dd', date)
(ForecastNode.ChildNodes[lin].Attributes['hour']='3') И
[1]
Пожалуйста подскажите как всё это внести в функцию

Последний раз редактировалось Gudzik11; 09.06.2012 в 10:37.
Gudzik11 вне форума Ответить с цитированием
Старый 09.06.2012, 10:42   #42
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Вот полный код проекта

Код:

{$R *.dfm}
procedure TForm1.Pogoda(Sender: TObject);
var
  doc: string ;
  tmp: textfile; // äëÿ ñîõðàíåíèÿ DOC
  lin : Integer ;
  ForecastNode: IXMLNode;
begin

   doc:=IdHTTP1.Get('http://xml.weather.co.ua/1.2/forecast/19?dayf=5&userid=yoursite_com');
    // ñîõðàíÿåì html ------------------------------------------------
  assignfile(tmp, 'weather.xml');
  rewrite(tmp);
  write(tmp, doc);
  closefile(tmp);
  //-----------------------------------------------------------------

   //  Ïîãîäà íà Ñåãîäíÿ
  XMLDocument1.XML.Add(doc);
  XMLDocument1.Active:=True;
  XMLDocument1.XML.Text;
 
   //èùåì óçåë forecast
   ForecastNode:=XMLDocument1.DocumentElement.ChildNodes.FindNode('forecast');
   if Assigned(ForecastNode) then
   //ðàç íàøëè - ïðîáåãàåìñÿ ïî âñåì äî÷åðíèì óçëàì

    for lin:= 0 to ForecastNode.ChildNodes.Count-1 do
     begin
       // 1 äåíü  ---------------------------------------------------------------------------------------
      if (ForecastNode.ChildNodes[lin].Attributes['date']= FormatDateTime('yyyy-mm-dd', date))and
         (ForecastNode.ChildNodes[lin].Attributes['hour']='3') then
        begin
          //íàøëè óçåë - âûâîäèì çíà÷åíèÿ íà ôîðìó

         pict1[2]:= ForecastNode.ChildNodes[lin].ChildValues['pict'] ;
         ppcp[1] :=ForecastNode.ChildNodes[lin].ChildValues['ppcp'] ;
         t_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['t'].ChildValues['min'];
         t_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['t'].ChildValues['max'];

         p_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['p'].ChildValues['min'];
         p_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['p'].ChildValues['max'];

         wind_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['min'];
         wind_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['max'];
         wind_rumb[1]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['rumb'];

         hmid_min[1]:=ForecastNode.ChildNodes[lin].ChildNodes['hmid'].ChildValues['min'];
         hmid_max[1]:=ForecastNode.ChildNodes[lin].ChildNodes['hmid'].ChildValues['max'];

         wpi[1]:= ForecastNode.ChildNodes[lin].ChildValues['wpi'] ;
          end;

       // 2 äåíü  ---------------------------------------------------------------------------------------
        if (ForecastNode.ChildNodes[lin].Attributes['date']= FormatDateTime('yyyy-mm-dd', date))and
         (ForecastNode.ChildNodes[lin].Attributes['hour']='9') then
        begin
          //íàøëè óçåë - âûâîäèì çíà÷åíèÿ íà ôîðìó

         pict1[3]:= ForecastNode.ChildNodes[lin].ChildValues['pict'] ;
         ppcp[2] :=ForecastNode.ChildNodes[lin].ChildValues['ppcp'] ;
         t_min[2]:=ForecastNode.ChildNodes[lin].ChildNodes['t'].ChildValues['min'];
         t_max[2]:=ForecastNode.ChildNodes[lin].ChildNodes['t'].ChildValues['max'];

         p_min[2]:=ForecastNode.ChildNodes[lin].ChildNodes['p'].ChildValues['min'];
         p_max[2]:=ForecastNode.ChildNodes[lin].ChildNodes['p'].ChildValues['max'];

         wind_min[2]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['min'];
         wind_max[2]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['max'];
         wind_rumb[2]:=ForecastNode.ChildNodes[lin].ChildNodes['wind'].ChildValues['rumb'];

         hmid_min[2]:=ForecastNode.ChildNodes[lin].ChildNodes['hmid'].ChildValues['min'];
         hmid_max[2]:=ForecastNode.ChildNodes[lin].ChildNodes['hmid'].ChildValues['max'];

         wpi[2]:= ForecastNode.ChildNodes[lin].ChildValues['wpi'] ;
          end;


          end;
          end;
  Memo1.Text:= wpi[2]+'     '+wpi[3];
  Edit1.Text:= update1;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Pogoda(nil);
end;

end.
Gudzik11 вне форума Ответить с цитированием
Старый 09.06.2012, 15:24   #43
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Сделал всё в ручную но если не трудно всё же скажите как внести в функцию .

И ещё такой вопрос можно ли эту процедуру занести в отдельный Unit а в основной программе просто использовать эти переменные .

вот сам проэкт:
Вложения
Тип файла: rar Погодник проба5.rar (287.7 Кб, 9 просмотров)
Gudzik11 вне форума Ответить с цитированием
Старый 09.06.2012, 22:38   #44
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Конечно можно.
Shouldercannon вне форума Ответить с цитированием
Старый 09.06.2012, 22:46   #45
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

А как не подскажешь
Gudzik11 вне форума Ответить с цитированием
Старый 13.06.2012, 22:59   #46
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Пример простейшего парсинга.
Спасибо начал в езжать чё к чему только не могу понять как мне в функцию превратить этот кусок кода
Код:
  startPos := PosEx('width=50 src=', MyText, StartPos +1); 
         endPos := PosEx('>', MyText, startPos);
    if StartPos > 0 then 
      begin
         text := Copy(MyText,(startPos+14),endPos-startPos-15);
        //HintT[lin]:= text;
         Memo1.Lines.Add(text); 
        lin:=lin+1;
      end
    else  
       Break;
Подскажите пожалуйста
Gudzik11 вне форума Ответить с цитированием
Старый 13.06.2012, 23:07   #47
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Примерно так:
Код:
function blablabla(MyText:string;var lin:integer):string;
var
startpos,endpos:integer;
begin 
startPos := PosEx('width=50 src=', MyText, StartPos +1); 
endPos := PosEx('>', MyText, startPos);
if StartPos > 0 then 
  begin
    inc(lin);
    result:=Copy(MyText,(startPos+14),endPos-startPos-15);
  end
else  
  result:='';
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.06.2012, 23:41   #48
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Вот мой код
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyText := idhttp1.Get('http://pogoda.meta.ua/Kharkivska/Kharkivskyi/Kharkiv/');
   // сохраняем html ------------------------------------------------
  assignfile(tmp, 'weather.html');
  rewrite(tmp);
  write(tmp, MyText);
  closefile(tmp);
  //-----------------------------------------------------------------
   StartPos := 0; // присваеваем переменной стартовое значение.
   lin:=0;  // Счётчик линий
   While true do // бесконечный цикл, выскакивать будем по условию
   begin
     startPos := PosEx('<img  title=', MyText, StartPos +1); // смысл такой, ищем '<BR>' начиная со следующей позиции после предидущего значения
    if StartPos > 0 then // чего-то нашли
      begin
        endPos := PosEx('width=50', MyText, startPos);
        text := Copy(MyText,(startPos+13),endPos-startPos-16);
        HintT[lin]:= text;
         Memo1.Lines.Add(text);                                      // записываем найденную позицию или еще чего
        lin:=lin+1;
      end
    else  // ничего не нашли
      begin
       Break; // значит выходим из цикла
        end;

         startPos := PosEx('width=50 src=', MyText, StartPos +1); // смысл такой, ищем  начиная со следующей позиции после предидущего значения
         endPos := PosEx('>', MyText, startPos);
    if StartPos > 0 then // чего-то нашли
      begin
         text := Copy(MyText,(startPos+14),endPos-startPos-15);
        //HintT[lin]:= text;
         Memo1.Lines.Add(text);                                      // записываем найденную позицию или еще чего
        lin:=lin+1;
      end
    else  // ничего не нашли
       Break; // значит выходим из цикла
  end;

  end;

end.
просто для каждого значения лень писать те самые действия

Тут должны меняться

<img title=
width=50

и каким то образом
HintT[lin] тоесть чтоб я задавал в какой массив записывать

Поможешь?

Последний раз редактировалось Gudzik11; 13.06.2012 в 23:45.
Gudzik11 вне форума Ответить с цитированием
Старый 22.06.2012, 09:37   #49
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Подскажите чё не так?
вот текст который надо разобрать

PHP код:
=====<trclass="wnow_tmpr">
<
tdclass="first"></td>
<
td>
+
21&deg;
</
td>
<
td>
+
23&deg;
</
td>
<
td>

+
30&deg;
</
td>
<
tdclass="cur">

+
24&deg;
</
td>
</
tr
Делаю так

Код:
 procedure pogoda1;
   var
     tmp: TextFile;
 mText: array [0..20] of string;
 MyText,text ,text1,text2: string;   // ïåðåìåííàÿ äëÿ òåêñòà
 StartPos,StartPos1 , endPos ,endPos1,i: integer ; // Íà÷ÿëüíîå âõîæäåíèå è êîíå÷üíîå
 lin: Integer;
begin
  lin:=1;

  MyText := Utf8ToAnsi(Form1.idhttp1.Get('http://meteo.ua/150/harkov/10-days'));
  MyText := extract(MyText, 'ww_block no_js">', '<!-- week_weather -->');
 StartPos := 0; // ïðèñâàåâàåì ïåðåìåííîé ñòàðòîâîå çíà÷åíèå.
   StartPos1 :=0;
   While true do // áåñêîíå÷íûé öèêë, âûñêàêèâàòü áóäåì ïî óñëîâèþ
   begin
 if StartPos > 0 then // ÷åãî-òî íàøëè
      begin
     text := Copy(MyText,(startPos),endPos-startPos);

      // Òåìïåðàòóðà íî÷ - âå÷åð
        tmp2[lin,1]:= Copy(text,Pos('<tr class="wnow_tmpr">',text),Pos('<tr class="wnow_icns">',text)-Pos('<tr class="wnow_tmpr">',text));
DeleteSymbol(tmp2[lin,1], ' ');
    while pos('<td>',tmp2[lin,1])<>0 do
        begin
         tmp2[lin,2] := extract(tmp2[lin,1], '<td>', '</td>');
        end;
     lin:=lin+1;
end
    else  
      begin
       Break; 
        end;
При запуске приложение зависает и нагружает процессор почти на полную
Gudzik11 вне форума Ответить с цитированием
Старый 22.06.2012, 10:09   #50
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Явно не весь код, StartPos занулен и используется, но ни где не меняется, end-ов не хватает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсинг Pein95 Работа с сетью в Delphi 4 01.12.2011 02:06
Парсинг tigrend PHP 8 02.10.2011 00:09
парсинг Pein95 C# (си шарп) 3 16.09.2011 01:24
Парсинг DJ_LINZA Работа с сетью в Delphi 6 31.01.2011 10:15
Парсинг. igor90 Microsoft Office Excel 1 03.11.2010 02:41