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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2014, 17:37   #1
Hoons
Новичок
Джуниор
 
Регистрация: 08.08.2014
Сообщений: 1
По умолчанию Парсинг определенного текста (Delphi)

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

Сам код программы:

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sButton, sMemo,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, sDialogs,
  sLabel;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    sMemo2: TsMemo;
    sButton2: TsButton;
    sOpenDialog1: TsOpenDialog;
    sMemo1: TsMemo;
    sLabel1: TsLabel;
    sLabel2: TsLabel;
    procedure sButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  parsing:string;
  html:string;

implementation

{$R *.dfm}

function Pars(T_, ForS, _T:string):string;
var a, b:integer;
begin
Result := '';
if (T_='') or (ForS='') or (_T='') then Exit;
a:=Pos(T_, ForS);
if a=0 then Exit else a:=a+Length(T_);
ForS:=Copy(ForS, a, Length(ForS)-a+1);
b:=Pos(_T, ForS);
if b>0 then
Result:=Copy(ForS, 1, b - 1);
end;





procedure TForm1.sButton2Click(Sender: TObject);
var
i:integer;
p:TstringList;
HTTP: TIdHTTP;
begin
HTTP:=TIdHTTP.Create(nil);
p:=TstringList.Create;
for I := 0 to sMemo1.Lines.Count -1 do
begin
p.Text:=HTTP.Get('http://news.mail.ru/inworld/moldova/economics/'+sMemo1.Lines.Strings[i]+'/?frommail=1');
parsing:=pars('<span class="c-params__date">',html,'</span>');

begin
sMemo2.Lines.Add(sMemo1.Lines.Strings[i]+' + '+parsing);
end;
end;
end;

end.
Снимок результата:

Hoons вне форума Ответить с цитированием
Старый 09.08.2014, 20:34   #2
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Интересно, что нет других брокерских компаний которые дают котировки? и для чего вам можно узнать?
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 09.08.2014, 22:04   #3
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 178
По умолчанию

Код:
...
uses 
 ..., strutils, idantifreeze; 
...
function Pars(T_, ForS, _T:string):string;
var
  a, b:integer;
begin
  Result := '';
  if (T_='') or (ForS='') or (_T='') then Exit;
  a:=pos(T_,ForS)+length(T_);   //находим начальную позицию
  b:=posex(_T,ForS,a);  //находим конечную позицию со сдвигом на количесто символов от начальной
  result:=copy(ForS,a,b-a);
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  HTTP: TIdHTTP;
  idantifreeze:tidantifreeze;
begin
  HTTP:=TIdHTTP.Create(self);
  idantifreeze:=tidantifreeze.Create(self);  //дабы предотвратить зависание приложения
  idantifreeze.Active:=true;
  for I := 0 to form1.Memo1.Lines.Count -1 do
    begin
    try
      html:=HTTP.Get('http://news.mail.ru/inworld/moldova/economics/'+Memo1.Lines.Strings[i]+'/?frommail=1');
    except
     on e:Exception do                                               // ошибки можно и не ловить
       application.MessageBox(pchar(e.Message),pchar(e.ClassName),0) // но их нужно обрабатывать
                                                                     // вместо этого можно просто оставить except end;
                                                                     // тогда ошибки будут просто игнорирооваться
    end;
      parsing:=pars('<span class="c-params__date">',html,'</span>');
      Memo2.Lines.Add(Memo1.Lines.Strings[i]+' + '+parsing);
    end;
    http.Free;      // созданные объекты нужно
    idantifreeze;   // освобождать
    {либо так:
    FreeAndNil(http);    
    FreeAndNil(idantifreeze);    
                 }
end;
Наверно лучше так. Кстати переменной html у тебя нигде не присваивалось значение и ты создавал экземпляры idhttp, но не уничтожал их.
DIONISKA вне форума Ответить с цитированием
Старый 09.08.2014, 22:05   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что-т я не понял что парсить нужно...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.08.2014, 07:09   #5
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Что-т я не понял что парсить нужно...
Во во) я тоже спросил но пока нет ответа)))
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 11.08.2014, 14:51   #6
Pearl777
Форумчанин
 
Регистрация: 04.01.2013
Сообщений: 171
По умолчанию

Код:
p.Text:=HTTP.Get('http://news.mail.ru/inworld/moldova/economics/'+sMemo1.Lines.Strings[i]+'/?frommail=1');
parsing:=pars('<span class="c-params__date">',html,'</span>');
Ты же загружаешь исходный код в p, а спарсить пытаешься из html.

Код:
parsing:=pars('<span class="c-params__date">',p.text,'</span>');
Pearl777 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывод определенного текста Diablow PHP 6 04.01.2014 22:50
Вытаскивание определенного текста с сайта. badname47 Общие вопросы Delphi 3 03.12.2011 17:14
Отображение определенного участка текста загружаймого из файла SeG_Dock Общие вопросы Delphi 7 16.07.2011 18:14
как проверить наличие определенного текста в строке jihot Общие вопросы Delphi 6 04.04.2010 18:40
Копирование текста из определенного поля в TWEBBROWSER ? 4pe6km Работа с сетью в Delphi 2 02.04.2009 01:24