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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2013, 00:08   #11
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Спасибо за пример) мне надо было очень быстро это сделать и хотел по просить кусок исходника=)))) Ну как можно спарсить чтоб как на сайте было? как я понял если тупо взять вытащить исходник а потом взять и скопировать мне нужные теги то CSS удалится? не будет же как на сайте так?=)) Это го мне не хотелось бы=) могу показать кучу сайтов где лежат всяческая инфа..... Но мне нужно только часть страничку загружать и все) Та часть которая мне нужна)))

В принципе можно спарсить Html код странички и потом отуда вот как занести данные в WebBrowser1???? чиркните кто может пример) Как я найду что нить я напишу сюды!
99% ошибок компьютера сидит в полуметре от монитора.

Последний раз редактировалось Stilet; 14.11.2013 в 00:56.
Fahman вне форума Ответить с цитированием
Старый 14.11.2013, 02:04   #12
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вообще я люблю парсить, но получился вот такой костыль:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, MSHTML;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure WebBrowser1DocumentComplete(ASender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    procedure WebBrowser1NavigateComplete2(ASender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    procedure WebBrowser1BeforeNavigate2(ASender: TObject;
      const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
      Headers: OleVariant; var Cancel: WordBool);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  CurDispatch: IDispatch;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://finviz.com/insidertrading.ashx?tc=2');
end;

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin (ASender as TWebBrowser)
  .hide;
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  DocA: IHTMLElementCollection;
  doc: IHTMLDocument2;
  Element: IHTMLElement;
  i: integer;
  fl: boolean;
begin
  if (pDisp = CurDispatch) then
  begin
    doc := ((pDisp as IWebBrowser).Document as IHTMLDocument2);
    DocA := doc.body.all as IHTMLElementCollection;
    i := 0;
    fl := true;
    while (i < DocA.length) and fl do
    begin
      Element := DocA.item(i, 0) as IHTMLElement;
      if Element.className = 'body-table' then
      begin
        doc.body.innerHTML :=
          '<span class="time-text" id="time"></span>' + Element.outerHTML;
        fl := false;
      end;
      inc(i);
    end; (ASender as TWebBrowser)
    .show;
    CurDispatch := nil;
  end;
end;

procedure TForm1.WebBrowser1NavigateComplete2(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if CurDispatch = nil then
    CurDispatch := pDisp;
end;

end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 14.11.2013 в 02:07.
BDA на форуме Ответить с цитированием
Старый 15.11.2013, 13:41   #13
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вообще я люблю парсить, но получился вот такой костыль:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, MSHTML;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure WebBrowser1DocumentComplete(ASender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    procedure WebBrowser1NavigateComplete2(ASender: TObject;
      const pDisp: IDispatch; var URL: OleVariant);
    procedure WebBrowser1BeforeNavigate2(ASender: TObject;
      const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
      Headers: OleVariant; var Cancel: WordBool);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  CurDispatch: IDispatch;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://finviz.com/insidertrading.ashx?tc=2');
end;

procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin (ASender as TWebBrowser)
  .hide;
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  DocA: IHTMLElementCollection;
  doc: IHTMLDocument2;
  Element: IHTMLElement;
  i: integer;
  fl: boolean;
begin
  if (pDisp = CurDispatch) then
  begin
    doc := ((pDisp as IWebBrowser).Document as IHTMLDocument2);
    DocA := doc.body.all as IHTMLElementCollection;
    i := 0;
    fl := true;
    while (i < DocA.length) and fl do
    begin
      Element := DocA.item(i, 0) as IHTMLElement;
      if Element.className = 'body-table' then
      begin
        doc.body.innerHTML :=
          '<span class="time-text" id="time"></span>' + Element.outerHTML;
        fl := false;
      end;
      inc(i);
    end; (ASender as TWebBrowser)
    .show;
    CurDispatch := nil;
  end;
end;

procedure TForm1.WebBrowser1NavigateComplete2(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if CurDispatch = nil then
    CurDispatch := pDisp;
end;

end.

Спасибо большое=) Ща буду пробовать) Можно вас по просить урок? Ну вы же знаете что пишите? а я вот не знаю просто скопировать и вставить я не хочу так) Хочу научится нормально программировать=) Ну или тут в коментариях не много указать что да как) ну за пример отдельное вам спасибо!
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 15.11.2013, 14:18   #14
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

BDA
Профессионал

Спасибо, все то что я хотел и все то что надо было вы сделали, Только она что то долго копирует все в webbrowser да и не проблема) Можно вас попросить описать этот исходник? что бы я понял что да как это работает. В общем будьте моим сенсеям)
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 15.11.2013, 14:40   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Обработчик старта получения страницы
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://finviz.com/insidertrading.ashx?tc=2');
end;
Перед получение страницы мы веббраузер с формы скрываем (зачем?)
Код:
procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin (ASender as TWebBrowser)
  .hide;
end;
Когда документ загрузился срабатывает событие:
Код:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  DocA: IHTMLElementCollection;
  doc: IHTMLDocument2;
  Element: IHTMLElement;
  i: integer;
  fl: boolean;
begin
  if (pDisp = CurDispatch) then
  begin
// Получаем интерфейс на загруженный документ
    doc := ((pDisp as IWebBrowser).Document as IHTMLDocument2);
// Получем список его всех элементов - doc.body.all
    DocA := doc.body.all as IHTMLElementCollection;
    i := 0;
    fl := true;
//Проходимся по каждому элементу (всмысле тегу HTML не зависимо от вложенности)
    while (i < DocA.length) and fl do
    begin
// Получаем ссылку на i-й элемент
      Element := DocA.item(i, 0) as IHTMLElement;
// Если его класс такой-то
      if Element.className = 'body-table' then
      begin
// То в тело документа вставляем тег span, а потом уже и тот найденный элемент целиком
        doc.body.innerHTML :=
          '<span class="time-text" id="time"></span>' + Element.outerHTML;
        fl := false;
      end;
      inc(i);
    end;
// После всего показываем браузер с измененной страницей
// Теперь ясно зачем было нужно его скрывать - он так быстрее отработает без постоянной перерисоки
(ASender as TWebBrowser)
    .show;
    CurDispatch := nil;
  end;
end;
И вот у меня пример еще вспомнился:
Код:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);

var d:IHTMLDocument2; all,tbls:IHTMLElementCollection;
     t:IHTMLTable; r:IHTMLTableRow;c:IHTMLElement;
     k,i,j:integer;  ops,s:string;

 function GetFName:String;
 var i:integer;
 begin Result:='';
   tbls:=IHTMLElementCollection(all.tags('INPUT'));
   for i:=0 to tbls.length do begin
     c:=tbls.item(i,0) as IHTMLElement;
     if c.id='ctl00_centerContent_fileUploadXmlBarcodes' then begin
      result:=c.getAttribute('value',0);
      exit;
     end;
   end;
 end;

 begin
// Получаем документ загруженный
  d:=IHTMLDocument2(WebBrowser1.Document);
// Выбираем коллекцию всех его элементов
  all:=d.all;
// Но из нее отсеиваем все, оставляя только таблицы
  tbls:=IHTMLElementCollection(all.tags('TABLE'));
  t:=tbls.item(0,0) as IHTMLTable;
    //Caption:=GetFName;
// Если таблиц нет то выходим. Нечего парсить
  if VarIsClear(t) then exit;

//Иначе порулим по списку таблиц
  for i:=1 to t.rows.length-1 do begin
// Получим i-тую строку в таблице
    r:=t.rows.item(i,0) as IHTMLTableRow; s:='';
//Получим 2-. ячейку в таблице
    c:=r.cells.item(2,0) as IHTMLElement;
Если она пуста то продолжим цикл
    if c.innerHTML='' then Continue;
Если в ней находится число 41 то увеличим счетчик таких ячеек
    if (copy(c.innerHTML,1,2)='41') then begin tag:=tag+1; Continue;end;

// Пройдемся по ячейкам строки
    for j:=0 to r.cells.length-1 do begin
//Для составления списка их содержимого в переменку s
     c:=r.cells.item(j,0) as IHTMLElement;
     if j=1 then ops:=c.innerHTML;
     s:=s+c.innerHTML+#2;
     
     inc(k);
    end;
    ct.AddRes(ops,s);
    inc(xlsLastRow);
  end;
  Screen.Cursor:=crDefault;
  ShowMessage('Накоплено '+IntToStr(k)+' записей. '#13#10
   +IntToStr(tag)+' записей отсеяно');
 end;
Это я парсил один сайтик выдирая элементы ячеек таблицы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2013, 15:59   #16
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Обработчик старта получения страницы
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate('http://finviz.com/insidertrading.ashx?tc=2');
end;
Перед получение страницы мы веббраузер с формы скрываем (зачем?)
Код:
procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin (ASender as TWebBrowser)
  .hide;
end;
Когда документ загрузился срабатывает событие:
Код:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  DocA: IHTMLElementCollection;
  doc: IHTMLDocument2;
  Element: IHTMLElement;
  i: integer;
  fl: boolean;
begin
  if (pDisp = CurDispatch) then
  begin
// Получаем интерфейс на загруженный документ
    doc := ((pDisp as IWebBrowser).Document as IHTMLDocument2);
// Получем список его всех элементов - doc.body.all
    DocA := doc.body.all as IHTMLElementCollection;
    i := 0;
    fl := true;
//Проходимся по каждому элементу (всмысле тегу HTML не зависимо от вложенности)
    while (i < DocA.length) and fl do
    begin
// Получаем ссылку на i-й элемент
      Element := DocA.item(i, 0) as IHTMLElement;
// Если его класс такой-то
      if Element.className = 'body-table' then
      begin
// То в тело документа вставляем тег span, а потом уже и тот найденный элемент целиком
        doc.body.innerHTML :=
          '<span class="time-text" id="time"></span>' + Element.outerHTML;
        fl := false;
      end;
      inc(i);
    end;
// После всего показываем браузер с измененной страницей
// Теперь ясно зачем было нужно его скрывать - он так быстрее отработает без постоянной перерисоки
(ASender as TWebBrowser)
    .show;
    CurDispatch := nil;
  end;
end;
И вот у меня пример еще вспомнился:
Код:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);

var d:IHTMLDocument2; all,tbls:IHTMLElementCollection;
     t:IHTMLTable; r:IHTMLTableRow;c:IHTMLElement;
     k,i,j:integer;  ops,s:string;

 function GetFName:String;
 var i:integer;
 begin Result:='';
   tbls:=IHTMLElementCollection(all.tags('INPUT'));
   for i:=0 to tbls.length do begin
     c:=tbls.item(i,0) as IHTMLElement;
     if c.id='ctl00_centerContent_fileUploadXmlBarcodes' then begin
      result:=c.getAttribute('value',0);
      exit;
     end;
   end;
 end;

 begin
// Получаем документ загруженный
  d:=IHTMLDocument2(WebBrowser1.Document);
// Выбираем коллекцию всех его элементов
  all:=d.all;
// Но из нее отсеиваем все, оставляя только таблицы
  tbls:=IHTMLElementCollection(all.tags('TABLE'));
  t:=tbls.item(0,0) as IHTMLTable;
    //Caption:=GetFName;
// Если таблиц нет то выходим. Нечего парсить
  if VarIsClear(t) then exit;

//Иначе порулим по списку таблиц
  for i:=1 to t.rows.length-1 do begin
// Получим i-тую строку в таблице
    r:=t.rows.item(i,0) as IHTMLTableRow; s:='';
//Получим 2-. ячейку в таблице
    c:=r.cells.item(2,0) as IHTMLElement;
Если она пуста то продолжим цикл
    if c.innerHTML='' then Continue;
Если в ней находится число 41 то увеличим счетчик таких ячеек
    if (copy(c.innerHTML,1,2)='41') then begin tag:=tag+1; Continue;end;

// Пройдемся по ячейкам строки
    for j:=0 to r.cells.length-1 do begin
//Для составления списка их содержимого в переменку s
     c:=r.cells.item(j,0) as IHTMLElement;
     if j=1 then ops:=c.innerHTML;
     s:=s+c.innerHTML+#2;
     
     inc(k);
    end;
    ct.AddRes(ops,s);
    inc(xlsLastRow);
  end;
  Screen.Cursor:=crDefault;
  ShowMessage('Накоплено '+IntToStr(k)+' записей. '#13#10
   +IntToStr(tag)+' записей отсеяно');
 end;
Это я парсил один сайтик выдирая элементы ячеек таблицы.
Спасибо, очень интересно сразу стало) Есть ли какая нить книга? обучению парсинга? ну там чтоб сайт со скринами и с исходниками чтоб я понимал что да как) кому не лень может чиркнет в формате doc? =) буду изучать=) Вот еще что думаю... Страничка до долго отображается, и это слегка напрягает, думаю может часть кода сделать при открытии формы? а потом тупо брать с memo или откуда там и загружать страничку? ну как нить главное чтоб она сама быстро обновлялась) Классный Форум, а главное все так быстро!
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 15.11.2013, 16:03   #17
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Есть ли какая нить книга? обучению парсинга? ну там чтоб сайт со скринами и с исходниками
это будет инструкция для посещения гальюна
eval вне форума Ответить с цитированием
Старый 15.11.2013, 16:37   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это будет инструкция для посещения гальюна
Причем для каждого гальюна она будет разная и толще чем Война и Мир )))
Цитата:
Есть ли какая нить книга?
Нет такой книги и никогда не будет. Парсинг сайтов сродни взлому.
Цитата:
Страничка до долго отображается, и это слегка напрягает
потому что WebBrowser подкачивает не только HTML а еще и картинки, гифки, флешки и прочую ненужную для парсинга бурду, к тому же выполняя JS. Так что раз выбрал такой способ - терпи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2013, 16:59   #19
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Терпение занимает около 6-8 секунд=( думаю сделать так:
Код:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  DocA: IHTMLElementCollection;
  doc: IHTMLDocument2;
  Element: IHTMLElement;
  i: integer;
  fl: boolean;
begin
Этот код добавить в webbrowser2 а не "1" А первый веббраузер можно загрузить в то время как открылась форма=) Потом про тестирую отпишусь. Может кому интересно будет...
99% ошибок компьютера сидит в полуметре от монитора.

Последний раз редактировалось Stilet; 15.11.2013 в 17:31.
Fahman вне форума Ответить с цитированием
Старый 15.11.2013, 17:32   #20
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Этот код добавить в webbrowser2 а не "1" А первый веббраузер можно загрузить в то время как открылась форма=)
И что это даст?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Webbrowser и парсинг содержимого страницы Дима я Работа с сетью в Delphi 14 02.07.2015 16:50
Парсинг c webbrowser Arsenx777 Общие вопросы Delphi 3 02.11.2011 23:08
Как лучше сделать открывающуюся часть формы? ImmortalAlexSan Win Api 2 13.07.2011 01:58
Как лучше? по собственному событию или по кнопке Seran4ek Общие вопросы Delphi 3 02.04.2010 22:42
Создание странички в WebBrowser celovec Работа с сетью в Delphi 5 08.08.2007 16:05