Как сохранить Html на компьютер?

  • Автор темы Admin
  • Дата начала
A

Admin

#1
Не подскажете безграмотному как заставить свою программу сохранять открывающуюся (или открывшуюся) html страничку? Если можно, приведите пожалуйста кусочек кода. Заранее спасибо!
 
T

tolorion

#2
Страница загружена в WebBrowser. Как сохранить ее полностью, а не только html код.
 

alik86

Lotus team
20.11.2008
465
1
#3
Выбрать пункт меню Файл -> Сохранить как... Выбрать тип файла что-то типа "Веб-страница, полностью" -> нажать "Сохранить"
 
T

tolorion

#4
Имеется ввиду, что на форму кинут WebBrowser1, в него загружена страница. Теперь необходимо эту страницу сохранить на жесткий диск, т.е. программно реализовать функцию Файл -> Сохранить как.
 

alik86

Lotus team
20.11.2008
465
1
#5
Ой, а я и не заметил, что это раздел "Delphi - Сети". Всё, умываю руки... :)
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#6
Код:
uses 
ActiveX, MSHTML_TLB, SHDocVw_TLB, 
ComCtrls, OleCtrls; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
HTMLDocument: IHTMLDocument2; 
PersistFile: IPersistFile; 
begin 
HTMLDocument := WebBrowser1.Document as IHTMLDocument2; 
PersistFile := HTMLDocument as IPersistFile; 
PersistFile.Save(StringToOleStr('c:\SavedFile.html'), System.True); 
end;
либо
раздел uses ActiveX. Двигаемся дальше теперь кидаем на форму две кнопочки (button) с закладки standart, компонент SaveDialog с закладки Dialog и компонент webBrowser с закладки internet. Так с компонентами вроде разобрались

Создаем обработчик событий(onclick) на первой кнопке и в нем прописываем следующий код:

webbrowser1.Navigate('http://www.delphiexpert.ru');

Так теперь переходим на самый верх и сразу же после public пишем:

procedure SaveHTMLSourceToFile(const FileName: string; WB: TWebBrowser);

Нажимаем комбинацию клавиш Ctrl+Shift+C

И Delphi автоматически генерирует процедуру, получиться должно примерно так:

procedure TForm1.SaveHTMLSourceToFile(const FileName: string;
WB: TWebBrowser);
begin

end;

Сейчас давайте пропишем действия, которые будет выполнять данная процедура, а именно она должна сохранять текущий открытый в компоненте webbrowser документ в виде исходника HTML

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;

Вот практически и все осталось только создать обработчик событий (onClick) на второй кнопке и прописать там:

if SaveDialog1.Execute then
SaveHTMLSourceToFile(SaveDialog1.FileName, WebBrowser1);
 
T

tolorion

#8
Попробовал вторым способом!
Вот код
-------------------------------------------------------------------
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
SaveDialog1: TSaveDialog;
WebBrowser1: TWebBrowser;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure SaveHTMLSourceToFile(const FileName: string; WB: TWebBrowser);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
webbrowser1.Navigate('http://www.delphiexpert.ru');
end;

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.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
SaveHTMLSourceToFile(SaveDialog1.FileName, WebBrowser1);
end;

end.
-------------------------------------------------------------------------------------------------------
Загрузил страницу в WB нормально!
Сохранил через SD страницу как 'de.html'
Теперь пробую открыть сохраненную страницу в FireFox'е и получается следующая картина
url_bad.jpg
-------------------------------------------
а должно быть вот так
url_Norma.jpg
-------------------------------------------
Объясните, plz, в чем проблема???
 

Вложения

hosm

* so what *
18.05.2009
2 442
6
#9
Похоже, что css не скачивали и/или путь к нему неправильный?
 
T

tolorion

#10
CSS (англ. Cascading Style Sheets — каскадные таблицы стилей)
Это для меня слишком сложно...
Когда я сохраняю страницу в FireFox'e, то генерируется два файла: непосредственно html страница и папка с рисунками. В нашем же случае сохраняется только html страница, а папки с рисунками я не нахожу. Может быть в этом все дело?
 
09.11.2009
665
1
#12

Вложения

T

tolorion

#14
Можно попробовать так(сохранять в MHT). или тут , но там нужны модули adodb_tlb, cdo_tlb.
Посмотреть вложение 4222
Посмотреть вложение 4223

ЗЫ Пример, который сохраняет страницу вместе с картинками
Посмотреть вложение 4224
Не могу скачать пример www.zip
Щелкаю на ссылке ADODB_TLB.pas - он открывается в новой вкладке, CDO_TLB.pas тоже открывается в новой вкладке, щелкаю по ссылке www.zip загружается страница codeby.net/ipb.html
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#15
ADODB_TLB.pas - он открывается в новой вкладке, CDO_TLB.pas тоже открывается в новой вкладк
правая кнопка - сохранить как.
по ссылке www.zip загружается страница codeby.net/ipb.html
не должно так быть. у меня все качает..
 
T

tolorion

#16
правая кнопка - сохранить как.
не должно так быть. у меня все качает..
Да, Вы правы, через правую кнопку - сохранить как закачал архив. Распаковал, запустил проект. Высветилась какая-то ошибка... нет какой-то dll... не успел заметить, т.к. нажал ОК, запустил RUN и проект скомпилировался и запустился. Загружаю URL 'http://www.delphiexpert.ru'. Загрузил нормально. Сохраняю страницу (назвал 'de.html') в отдельную папку. Рисунки тоже сохраняются.
Save_URU.jpg
Теперь запускаю файл 'de.html' в Google Chrome или FireFox'e и вот что получается:
URL_in_Chrome.jpg
 

Вложения

vital

Больной Компом Детектед
29.01.2006
2 432
33
#17
Хром не умеет открывать mht файы. Открывайте IE
 
T

tolorion

#18
Хром не умеет открывать mht файы. Открывайте IE
Perfect!!!
Открыл сохраненную на жестком диске страницу в IE. Страница открылась идеально со всеми рисунками!
Всем кто помогал в раскрытии темы огромное СПАСИБО и RESPECT!
 
T

tolorion

#19
Хром не умеет открывать mht файы. Открывайте IE
Возникла следующая проблема.
Если открывать документ, сохраненный в выше приведенном примере (www.zip) в Internet Explorer'е, то он открывается нормально. Но если документ открывать в WebBrowser1 нашего проекта, то вылетает сообщение:
oshibka_scenariya.jpg
Добавил в проект OpenDialog и копку для загрузки файла; в качестве документа использовал страницу 'http://codeby.net/forum/threads/18385.html', которую сохранил как 'codeby.mht'.

Вот добавленный код:

procedure TForm36.FormCreate(Sender: TObject);
begin
Edit1.Text:='http://codeby.net/forum/threads/18385.html';
end;

procedure TForm36.ButtonLoadClick(Sender: TObject);
begin
if Opendialog1.Execute then
WebBrowser1.Navigate(opendialog1.fileName);
end;

Что нужно сделать, чтобы избежать ошибки?
 

Вложения

T

tolorion

#20
Хром не умеет открывать mht файы. Открывайте IE
И еще!
Если соединение с интернетом по какой-либо причине отсутствует (например, нет вообще), то даже в Internet Explorer'e страница открывается не корректно
bez_interneta.jpg

...???
 

Вложения