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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2011, 23:32   #1
DjDram
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 53
По умолчанию HTML исходный код (парсинг)

Столкнулся с такой проблемой пытаюсь открыть исходный код html страницы в memo

Код:
Procedure TForm1.Button1Click(Sender: TObject);
var
     IdHTTP     :   TIdHTTP;
     WebDoc     :   TStringStream;
     url:   String;
Begin
   Result := false;
   IdHTTP := TIdHTTP.Create(nil); //создаём компонент TIdHTTP
     try
        WebDoc := TStringStream.Create(''); // создаём поток символов
         try
   with IdHTTP do // в компоненте
     Begin
          Request.UserAgent := 'MSIE'; // устанавливаем тип браузера
          Request.Host := 'www.youtube.com'; // устанавливаем хост
      End;
url:='http://www.youtube.com/watch?v=oOihh3Gy8ZU&feature=topvideos_entertainment'; // присваевываем переменной адрес страницы
IdHTTP.Get(url, WebDoc); //заносим символы страницы в поток
MEMO1.Text:=WEBDOC.datastring; // выводим поток символов в текстовое поле
          finally
          WebDoc.Free; // высвобождаем поток
          end;
     finally
        IdHTTP.Free; // высвобождаем компонент
     end;
  end;
end.
так вот если открыть страницу таким образом мы получим исходный код страницы, но самое интересное если открыть её браузером IE и нажать исходный код то она будет не идентична полученной как получить полную копию исходного кода данной страницы?
DjDram вне форума Ответить с цитированием
Старый 09.09.2011, 02:10   #2
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Написать движок для выполнения яваскриптов *trollface*
TwiX вне форума Ответить с цитированием
Старый 09.09.2011, 02:53   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. GET метод может вернуть исходник как результат.. все проще:
Код:
var
  ResultS:string;
  http:TidHTTP;
begin
http:=TidHTTP.Create;
s:=http.get('http://mydomain.com/blablabla');
http.free;
end;
2. гениальная мысль, в run-time создать TWebBrowser, загрузить страницу, спереть исходник и уничтожить WebBrowser.
Человек_Борща вне форума Ответить с цитированием
Старый 09.09.2011, 12:35   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

первое на взгляд что пришло в голову, это то что не маскируетесь вы под IE.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.09.2011, 19:32   #5
DjDram
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 53
По умолчанию

Вот схраняем в файл парс страницы
Код:
.....
uses
  ...... ActiveX, MSHTML;
.......
Код:
.....
 public
procedure SaveHTMLSourceToFile(const FileName: string; WB: TWebBrowser);
......
Код:
procedure TForm1.SaveHTMLSourceToFile(const FileName: string;
 WB: TWebBrowser);
var
 PersistStream: IPersistStreamInit;
 FileStream: TFileStream;
 Stream: IStream;
 SaveResult: HRESULT;
begin
 PersistStream := WB.Document as IPersistStreamInit;
 FileStream := TFileStream.Create(FileName, fmCreate);
try
 Stream := TStreamAdapter.Create(FileStream, soReference) as IStream;
 SaveResult := PersistStream.Save(Stream, True);
if FAILED(SaveResult) then
 MessageBox(Handle, 'Fail to save HTML source', 'Error', 0);
finally
 FileStream.Free;
end;
end;
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
webbrowser1.Navigate('http://www.youtube.com/watch?NR=1&v=cPujBlFSQtU');
if SaveDialog1.Execute then
 SaveHTMLSourceToFile(SaveDialog1.FileName, WebBrowser1);
end;

вообщем получается что HTML код сохраняется в файл а как сделать чтоб он был не в файле а в StringStream
DjDram вне форума Ответить с цитированием
Старый 10.09.2011, 19:40   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
 FileStream: TFileStream;
ну это же очевидно...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.09.2011, 20:19   #7
DjDram
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 53
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
 FileStream: TFileStream;
ну это же очевидно...
procedure TForm1.Button2Click(Sender: TObject);
var
PersistStream: IPersistStreamInit;
WebDoc: TStringStream;
Stream: IStream;
SaveResult: HRESULT;
begin
webbrowser1.Navigate('http://www.youtube.com/watch?NR=1&v=cPujBlFSQtU');
PersistStream := WebBrowser1.Document as IPersistStreamInit;
WebDoc := TStringStream.Create('');

try
Stream := TStreamAdapter.Create(WebDoc, soReference) as IStream;
SaveResult := PersistStream.Save(Stream, True);
if FAILED(SaveResult) then
MessageBox(Handle, 'Fail to HTML source', 'Error', 0);
MEMO1.Text:=WEBDOC.DataString;
finally
WebDoc.Free;
end;

как то так не работает....
DjDram вне форума Ответить с цитированием
Старый 10.09.2011, 20:30   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а где создание объекта потока?
Код:
procedure SaveHTMLSourceToStream(s:TStream;
 WB: TWebBrowser);
var
 PersistStream: IPersistStreamInit;
 Stream: IStream;
 SaveResult: HRESULT;
begin
 PersistStream := WB.Document as IPersistStreamInit;
try
 Stream := TStreamAdapter.Create(s, soReference) as IStream;
 SaveResult := PersistStream.Save(Stream, True);
if FAILED(SaveResult) then
 MessageBox(Handle, 'Fail to save HTML source', 'Error', 0);
except

end;
end;
применяем так:
Код:
StringStream:=TStringStream.Create;
SaveHTMLSourceToStream(StringStream,WB);
//используем StringStream
StringStream.Free;
на основе этого можно сделать такое:
Код:
procedure SaveHTMLSourceToStrings(s:TStrings;WB:TWebBrowser);
var t:TMemoryStream;
begin
 t:=TMemoryStream.Create;
 SaveHTMLSourceToStream(t,WB);
 s.Clear;
 t.Posotion:=0;
 s.LoadFromStream(t);
 t.free;
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.09.2011, 21:22   #9
DjDram
Пользователь
 
Регистрация: 14.06.2009
Сообщений: 53
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 StringStream:TStringStream;
begin
StringStream:=TStringStream.Create;
SaveHTMLSourceToStream(StringStream,WebBrowser1);
MEMO1.Text:=StringStream.DataString;
StringStream.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.youtube.com/watch?v=lkKhfP4fZZs&feature=relmfu');
end;
А как сделать чтобы не двумя а одной кнопкой это обрабатывалось?

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 StringStream:TStringStream;
begin
WebBrowser1.Navigate('http://www.youtube.com/watch?v=lkKhfP4fZZs&feature=relmfu');
StringStream:=TStringStream.Create;
SaveHTMLSourceToStream(StringStream,WebBrowser1);
MEMO1.Text:=StringStream.DataString;
StringStream.Free;
end;
если объединяю выскакивает ошибка
DjDram вне форума Ответить с цитированием
Старый 10.09.2011, 21:28   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что надо ждать события OnDocumentComplete(и в том еще проверять на статус браузера)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исходный код сайта. 2 Тутонхамон Работа с сетью в Delphi 0 22.05.2011 14:38
Исходный код сайта. Тутонхамон Работа с сетью в Delphi 7 22.05.2011 07:59
преобразовать исходный код *Оля* Паскаль, Turbo Pascal, PascalABC.NET 0 18.04.2010 20:47
Исходный код страницы Abuhamed PHP 5 02.02.2010 00:34
Расформатировать исходный код страницы OdNairy Работа с сетью в Delphi 5 19.09.2009 18:13