Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
Despot
5 / 5 / 2
Регистрация: 03.05.2009
Сообщений: 24
1

Получение форматированной HTML-страницы

07.09.2009, 11:44. Просмотров 6312. Ответов 12

Знает ли кто-нибудь с помощью чего (компонент, компонент + код) можно сохранять локально HTML-страницы в таком же виде, как позволяют их сохранять ИЭ или ФайрФокс?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2009, 11:44
Ответы с готовыми решениями:

Получение кода web страницы
Всем доброго времени суток... Задача заключается в следующем ... : есть сайт, например...

Получение кода страницы в потоке используя CppWebBrowser
Проблема состоит в том, что во время выполнения кода: AnsiString url_site =...

Парсинг HTML страницы
Всем доброго дня. Кто делал парсинг HTML стриницы с помощью CppWebBrowser и OleObject. Как считать...

Скачивание html страницы.
Мне надо сначала пройти авторизацию на сервере потом скачать html код. Как скачать я знаю через...

Парсинг html страницы
Доброго времени суток! Мне нужно сделать парсинг html страницы из WWW. Подскажите пожалуйста,...

12
oxotnik
1634 / 1107 / 75
Регистрация: 21.08.2008
Сообщений: 4,648
Записей в блоге: 1
Завершенные тесты: 1
07.09.2009, 11:51 2
с картинками?
0
Despot
5 / 5 / 2
Регистрация: 03.05.2009
Сообщений: 24
07.09.2009, 11:55  [ТС] 3
В идеале - да.
0
oxotnik
1634 / 1107 / 75
Регистрация: 21.08.2008
Сообщений: 4,648
Записей в блоге: 1
Завершенные тесты: 1
07.09.2009, 12:01 4
жаль что ссылки запрещены, придется копипастить:

3. Как скачать файл из Инета?

Ответ ================================================

3.1. Вариант 1.
Можно возпользоваться компонентом TIdHTTP с вкладки Indy. Данные компоненты входят в поставку BCB начиная с версии 6.0. Для более ранних версий BCB их можно скачать с оффсайта разработчика: INDY


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
void __fastcall TMainForm::GetBtnClick(TObject *Sender)
{
TFileStream* fs;
 
int ReadByte=0;
int ReadBlock=0;
int NewReadBlock=ReadBlockEd->Text.ToInt();
bool Done=false;
 
String File=FileEd->Text;
String URL = URLEd->Text;
 
IdHTTP1->Request->ProxyPassword = PasswordEd->Text;
IdHTTP1->Request->ProxyServer = "ps.proxy.ru";
IdHTTP1->Request->ProxyPort = 3128;
IdHTTP1->Request->ProxyUsername = UserEd->Text;
 
//если файл ранее уже закачивался...
if(ini->SectionExists(URL)) {
ReadByte = ini->ReadInteger(URL, "ReadByte", 0);
Done = ini->ReadBool(URL, "Done", true);
if(Done) {
ShowMessage(String("Файл закачен полностью. Размер - ") + ReadByte + String(" байт."));
return;
}
ReadBlock = ini->ReadInteger(URL, "ReadBlock", 0);
ReadBlock = (ReadBlock == NewReadBlock)? ReadBlock:NewReadBlock;
File = ini->ReadString(URL, "File", 0);
 
TFileStream* fs = new TFileStream(File, fmOpenWrite);
fs->Position = ReadByte;
IdHTTP1->Request->ContentRangeStart = ReadByte;
IdHTTP1->Request->ContentRangeEnd = ReadByte + ReadBlock;
IdHTTP1->Get(URL, fs);
 
if(IdHTTP1->Request->ContentRangeEnd > IdHTTP1->Response->ContentRangeEnd) {
ini->WriteInteger(URL, "ReadByte", IdHTTP1->Response->ContentLength + IdHTTP1->Response->ContentRangeStart);
ini->WriteInteger(URL, "ReadBlock", ReadBlock);
//ini->WriteString(URL, "File", File);
ini->WriteInteger(URL, "Done", true);
}
else {
ini->WriteInteger(URL, "ReadByte", ReadByte + ReadBlock);
ini->WriteInteger(URL, "ReadBlock", ReadBlock);
//ini->WriteString(URL, "File", File);
ini->WriteInteger(URL, "Done", false);
}
 
delete fs;
}
else {
TFileStream* fs = new TFileStream(File, fmCreate);
 
fs->Position = ReadByte;
IdHTTP1->Request->ContentRangeStart = ReadByte;
IdHTTP1->Request->ContentRangeEnd = ReadByte + NewReadBlock;
IdHTTP1->Get(URL, fs);
 
if(IdHTTP1->Request->ContentRangeEnd > IdHTTP1->Response->ContentRangeEnd) {
ini->WriteInteger(URL, "ReadByte", IdHTTP1->Response->ContentLength + IdHTTP1->Response->ContentRangeStart);
ini->WriteInteger(URL, "ReadBlock", NewReadBlock);
ini->WriteString(URL, "File", File);
ini->WriteInteger(URL, "Done", true);
}
else {
ini->WriteInteger(URL, "ReadByte", ReadByte + NewReadBlock);
ini->WriteInteger(URL, "ReadBlock", NewReadBlock);
ini->WriteString(URL, "File", File);
ini->WriteInteger(URL, "Done", false);
}
 
delete fs;
}
}
3.2. Вариант 2.
Воспользоваться функциями WinInet. Необходимо включить хедер wininet.h и подключить к проекту файл $(BCB)\LIB\PSDK\wininet.lib


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char szUrl[] = "http://www.codenet.ru";
//String Page;
 
HINTERNET hInternet = InternetOpen("MY AGENT",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
 
HINTERNET hRequest = InternetOpenUrl(hInternet, szUrl, NULL, 0, 0, 0);
 
if(hRequest)
{
DWORD dwRead;
char szTemp[1024];
TFileStream* fs = new TFileStream(ExtractFilePath(Application->ExeName) + "\\Page.html", fmCreate);
while (InternetReadFile(hRequest, (LPVOID)szTemp, 1024, &dwRead))
{
if (!dwRead) break;
fs->Write(szTemp, dwRead);
//Page = Page + String(szTemp);
}
delete fs;
}
 
InternetCloseHandle(hRequest);
InternetCloseHandle(hInternet);
}
3.3 Вариант 3.
Непосредственно юзать WinSock API. Например скачиваем страницу и помещаем ее содержимое в Memo.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//Winsock API
char request[]=
"GET / HTTP/1.0\r\n\
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n\
Accept-Language: ru\r\n\
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)\r\n\
Host: www.codenet.ru\r\n\r\n";
 
#define MAX_PACKET_SIZE 4096 
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
WSADATA ws; 
SOCKET s;
sockaddr_in adr;
hostent* hn;
char buff [MAX_PACKET_SIZE];
// Init
if (WSAStartup (0x0101, &ws) != 0)
{
// Error
return;
}
// Создаем сокет
if (INVALID_SOCKET == (s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP) ) )
{
// Error
return;
}
 
// получаем ИП
if (NULL == ( hn = gethostbyname ("www.yandex.ru") ) )
{
// Error
return;
}
 
// Заполгняем структуру
adr.sin_family = AF_INET;
adr.sin_addr.S_un.S_addr = *(DWORD* ) hn->h_addr_list[0];
adr.sin_port = htons (80);
 
// Устанавливаем соединение
if (SOCKET_ERROR == connect (s, (sockaddr* )&adr, sizeof (adr) ) )
{
// Error
return;
}
 
// Посылаем запрос
if (SOCKET_ERROR == send (s, request, strlen(request), 0) )
{
// Error
return;
}
 
// Принимаем данные
int len;
do
{
if (SOCKET_ERROR == (len = recv (s, (char *) &buff, MAX_PACKET_SIZE, 0) ) )
return;
Memo1->Lines->Add(buff);
}
while (len!=0);
 
 
/*int len = recv (s, (char *) &buff, MAX_PACKET_SIZE, 0);
 
if ( (len == SOCKET_ERROR) || (len == 0) )
{
// Error
return ;
}
 
// Выводим полученное
Memo1->Lines->Add(buff);*/
// Cae?uaaai niaaeiaiea
if (SOCKET_ERROR == closesocket (s) )
{
// Error
return ;
} 
 
}
3.4. И самый простой вариант.
Воспользоваться ф-ией URLDownloadToFile. Необходимо включить хедер urlmon.h и подключить к проекту файл $(BCB)\LIB\PSDK\urlmon.lib

C++
1
URLDownloadToFile( 0, "http://www.yandex.ru", "c:\\temp\myfile.html", 0, 0);
1
07.09.2009, 12:01
Despot
5 / 5 / 2
Регистрация: 03.05.2009
Сообщений: 24
07.09.2009, 12:18  [ТС] 5
Благодарствую. Буду пробовать.
А с помощью TCppWebBrowser можно подобное сделать?
0
Despot
5 / 5 / 2
Регистрация: 03.05.2009
Сообщений: 24
07.09.2009, 23:42  [ТС] 6
oxotnik, попробовал "3.2. Вариант 2." и "3.4.". Ни один их них не позволяет на выходе получить форматированный html-файл, подобный сохраняемому в браузере. Мало того, так еще и выходной файл не полный: ни один из вариантов не сохранил завершающие html-страницу тэги - </FONT></BODY></HTML>. И размер у выходных файлов в этих вариантах слишком разный.
Варианты с TIdHTTP у меняв ообще не заработал. Я его упростил, оставив только получение и сохранения файла, но выскакивает ошибка. Ну, да не проблема. Думаю, и "индийский" вариант не даст желаемого результата. Вопрос остается открытым. :-(
0
AlexSt
60 / 60 / 9
Регистрация: 13.01.2009
Сообщений: 322
08.09.2009, 08:38 7
ты хочешь на выходе получить хтмл контейнер, или просто закачать с сайта страницу?
Вот интересная качалка с открытым исходным кодом
http://ru.wikipedia.org/wiki/Wget
как пример думаю подойдет.
0
oxotnik
1634 / 1107 / 75
Регистрация: 21.08.2008
Сообщений: 4,648
Записей в блоге: 1
Завершенные тесты: 1
08.09.2009, 09:32 8
Цитата Сообщение от Despot Посмотреть сообщение
Благодарствую. Буду пробовать.
А с помощью TCppWebBrowser можно подобное сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TFileStream *stm = 0;
TStreamAdapter *sa;
WORD mode = fmCreate;
stm = new TFileStream("page.html", mode);
IPersistStreamInit *psi;
stm->Seek(0, soFromBeginning);
sa = new TStreamAdapter(stm, soReference);
CppWebBrowser1->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi);
if (psi)
{
    psi->Save(*sa, true);
    psi->Release();
}
delete stm;
0
Despot
5 / 5 / 2
Регистрация: 03.05.2009
Сообщений: 24
08.09.2009, 10:07  [ТС] 9
Цитата Сообщение от AlexSt Посмотреть сообщение
ты хочешь на выходе получить хтмл контейнер, или просто закачать с сайта страницу?
Вот интересная качалка с открытым исходным кодом
http://ru.wikipedia.org/wiki/Wget
как пример думаю подойдет.
Я хочу получить на выходе файл, который очень приближен или идентичен по формату файлу, находящемуся на сервере. Пока я ничего подобного не получил. Понятно, что страница, сохраненная в браузере, тоже отличается от исходника, но моим результатам и до этого далеко.
За ссылку благодарю. Буду изучать.
0
oxotnik
1634 / 1107 / 75
Регистрация: 21.08.2008
Сообщений: 4,648
Записей в блоге: 1
Завершенные тесты: 1
08.09.2009, 10:34 10
Цитата Сообщение от Despot Посмотреть сообщение
Я хочу получить на выходе файл, который очень приближен или идентичен по формату файлу, находящемуся на сервере. Пока я ничего подобного не получил. Понятно, что страница, сохраненная в браузере, тоже отличается от исходника, но моим результатам и до этого далеко.
За ссылку благодарю. Буду изучать.
с помощью означенных выше способов страница загружается ровно так, как ее отдает сервер, а если что то не докачалось - значит рано прервали загрузку. Лично я делал по этим примерам (через сокеты) загрузку (с небольшими исправлениями и дополнениями) и все замечательно качалось. К стати в исходниках Wget примерно тот же самый принцип работы.
ЗЫ: если интересно, могу выложить класс многопоточной качалки файлов с инета.
0
Despot
5 / 5 / 2
Регистрация: 03.05.2009
Сообщений: 24
09.09.2009, 02:11  [ТС] 11
Цитата Сообщение от oxotnik Посмотреть сообщение
ЗЫ: если интересно, могу выложить класс многопоточной качалки файлов с инета.
Выложи, пж. Заценю.
0
Evg
Эксперт CАвтор FAQ
20068 / 7634 / 585
Регистрация: 30.03.2009
Сообщений: 21,345
Записей в блоге: 30
06.12.2009, 22:12 12
Despot, когда ты скачиваешь страницу с картинками, то там скачивается не один файл, а целая куча. Сначала скачивается основной hmtl файл, а потом по отдельности картинки и вся прочая чешуя
0
Gyffi91
0 / 0 / 0
Регистрация: 24.12.2010
Сообщений: 1
27.12.2010, 16:04 13
oxotnik, подскажи, пожалуйста, по этому варианту:

3.4. И самый простой вариант.
Воспользоваться ф-ией URLDownloadToFile. Необходимо включить хедер urlmon.h и подключить к проекту файл $(BCB)\LIB\PSDK\urlmon.lib

Код C++
1 URLDownloadToFile( 0, "http://www.yandex.ru", "c:\\temp\myfile.html", 0, 0);
Все подключил, все откомпилилось, запустилось, но тем не менее файл не загружается..
текст такой:

Код
#include <vcl.h>
#pragma hdrstop
#include <urlmon.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
URLDownloadToFile( 0, "localhost/lab1", "C:\temp\myfile.txt", 0, 0);
}
//---------------------------------------------------------------------------
Ссылка, которую мы указываем, какой вид должна иметь? Можно ли ссылаться на файл php? или принципиально, чтобы html? У меня windows 7, корректно ли работает эта функция на семерке? какого расширения должен быть конечный файл? Пробовал и myfile.txt и myfile.html, все равно файл не создается, а если создать руками, то он остается пустым. Ошибок никаких не выдает..
0
27.12.2010, 16:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2010, 16:04

вставка html страницы в с++ .Как?
Так народ нужна помощь, делаю учебник на с++, встал вопрос, как подрубить html страницы в с++ Кто...

Отображение HTML-страницы в приложении
есть ли в борланде какое-либо окошко в которое можно подключить html документ, и при запуске этой...

Сохранение HTML кода страницы.
Как можно без TWebBrowser сохранить HTML код WEB страницы?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru