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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.06.2018, 05:17
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 31
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Траблы с парсингом

Добрый день, или утро, ну или что у вас сейчас))

Пытаюсь спарсить погоду с gismeteo md
Получаю html, удаляю всё не нужное с начала и конца, оставив только то, что нужно парсить

Парсю )
Код такой:
Код:
var
i : integer;
s : string;
begin
  For i := 0 to smemo1.Lines.Count - 1 do
  begin
   s  := smemo1.Lines.Strings[i];
    if pos('<td class="cltext">',s) <> 0 then
    begin
      s  := copy(s,pos('<td class="cltext">',s)+19,length(s));
      s  := copy(s,0,pos('</td>',s)-1);
      smemo2.Lines.Add(s);
    end;
  end;
end;

в мемо 2, попадает сама погода, но только (ясно, облачно).
Почему не вырезается:
Малооблачно, небольшой дождь
Малооблачно, дождь, гроза


Вместо этих строк в мемо2 добавляется пустая строчка..



Код HTML:
<td class="cltext">Ясно</td> .... <td class="cltext">Облачно</td> ... <td class="cltext">Малооблачно, небольшой дождь</td> ... <td class="cltext">Малооблачно, дождь, гроза</td>

В коде что-то не учел или что?

Последний раз редактировалось Tech N9ne, 25.06.2018 в 05:20.
Ответить с цитированием
  #2  
Старый 25.06.2018, 11:00
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

На в скидку - вы построчно ответ обрабатываете,а его надо как строчку единую парсить, в смысле smemo1.text, переводы строк парсингу плохо поддаются
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Tech N9ne (25.06.2018)
  #3  
Старый 25.06.2018, 16:40
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 31
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
На в скидку - вы построчно ответ обрабатываете,а его надо как строчку единую парсить, в смысле smemo1.text, переводы строк парсингу плохо поддаются
Похоже дело не в этом.
Попробовал так
Код:
smemo2.Lines.Text := sMemo2.Lines.Text +'   '+ s;


Получаю тоже самое.. Такое ощущение, как будто из-за запятых или пробелов не вырезает.

Так выглядит отрывок HTML .
Код HTML:
<th title="Прогноз от 2018-06-24 12:00, UTC: 2018-06-26 18:00, Local: 2018-06-26 21:00"> Вечер </th> <td class="clicon"><img class="png" src="//s4.gismeteo.md/static/images/icons/new/n.moon.png" alt="Ясно" title="Ясно" width="55" height="55"></td> <td class="cltext">Ясно</td> <td class="temp"><span class='value m_temp c'>+23</span><span class='value m_temp f' style='display:none'>+73</span></td> <td><span class='value m_press torr'>759</span><span class='value m_press inch' style='display:none'>30</span><span class='value m_press hpa' style='display:none'>1012</span></td> <td><dl class="wind"><dt class="wicon wind2" title="Северо-восточный">СВ</dt><dd><span class='value m_wind ms'>3</span><span class='value m_wind mih' style='display:none'>7</span><span class='value m_wind kmh' style='display:none'>11</span></dd></dl></td> <td>40</td> <td><span class='value m_temp c'>+22</span><span class='value m_temp f' style='display:none'>+72</span></td> </tr> </tbody> <tbody id="tbwdaily3" style="display: none;"> <tr class="wrow forecast" id="wrow-2018-06-27-03"> <th title="Прогноз от 2018-06-24 12:00, UTC: 2018-06-27 0:00, Local: 2018-06-27 3:00"> Ночь </th> <td class="clicon"><img class="png" src="//s2.gismeteo.md/static/images/icons/new/n.moon.c2.r1.png" alt="Малооблачно, небольшой дождь" title="Малооблачно, небольшой дождь" width="55" height="55"></td> <td class="cltext">Малооблачно, небольшой дождь</td> <td class="temp"><span class='value m_temp c'>+20</span><span class='value m_temp f' style='display:none'>+68</span></td> <td><span class='value m_press torr'>758</span><span class='value m_press inch' style='display:none'>30</span><span class='value m_press hpa' style='display:none'>1011</span></td> <td><dl class="wind"><dt class="wicon wind1" title="Северный">С</dt><dd><span class='value m_wind ms'>4</span><span class='value m_wind mih' style='display:none'>9</span><span class='value m_wind kmh' style='display:none'>14</span></dd></dl></td> <td>49</td> <td><span class='value m_temp c'>+19</span><span class='value m_temp f' style='display:none'>+66</span></td> </tr>

Последний раз редактировалось Tech N9ne, 25.06.2018 в 16:43.
Ответить с цитированием
  #4  
Старый 25.06.2018, 21:13
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

У вас четкие теги в ответе, можно парсингом их раскрыть, можно стандартными методами (json), если это не подходит, покажите пжлст, что приходит (без чистки) и что должно отобразиться (что оставить), мож обычным поиском в тексте можно обойтись
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
Tech N9ne (25.06.2018)
  #5  
Старый 25.06.2018, 22:55
Tech N9ne Tech N9ne вне форума
Прохожий
 
Регистрация: 18.05.2018
Сообщения: 31
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
У вас четкие теги в ответе, можно парсингом их раскрыть, можно стандартными методами (json), если это не подходит, покажите пжлст, что приходит (без чистки) и что должно отобразиться (что оставить), мож обычным поиском в тексте можно обойтись
Это было что-то не так с парсингом...
После долгих мучений с гуглом, нашёл процедурку)
Код:
uses
  StrUtils;
 
//Поиск подстрок, расположенных между шаблонами aSub1 и aSub2.
//Найденные подстроки добавляются в список aSl.
procedure ParseStr(const aStr, aSub1, aSub2 : string; aSl : TStrings);
const
  SelfName = 'ParseStr()';
var
  L1, L2, P1, P2 : Integer;
begin
  if aSl = nil then
    raise Exception.Create(SelfName + '. ГЋГёГЁГЎГЄГ*! Ñïèñîê Г*ГҐ ñîçäГ*Г*.');
  L1 := Length(aSub1);
  L2 := Length(aSub2);
  P1 := 1;
  P2 := 0;
  repeat
    //Ищем первый тег, начиная с позиции P1.
    P1 := PosEx(aSub1, aStr, P1);
    //Если нашли первый тег.
    if P1 > 0 then begin
      //Справа от первого тега ищем второй тег.
      P2 := PosEx(aSub2, aStr, P1 + L1);
      //Если нашли второй тег.
      if P2 > 0 then begin
        //Подстроку, которая расположена между тегами, добавляем в aSl.
        aSl.Add( Copy(aStr, P1 + L1, P2 - P1 - L1) );
        //Начальную позицию поиска располагаем справа от второго тега.
        P1 := P2 + L2;
      end;
    end;
  //Если первый или второй тег оказался не найденным, то выходим из цикла.
  until (P1 = 0) or (P2 = 0);
end;
 
//Пример использования.
//В Memo1 - исходный текст, в Memo2 выводятся результаты поиска.
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Clear;
  ParseStr(Memo1.Text, '<artist>', '</artist>', Memo2.Lines);
end;

Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter