Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 615
1

Как скопировать содержимое браузера в текстовой файл?

10.09.2014, 20:18. Просмотров 1691. Ответов 7
Метки нет (Все метки)


Всем вечер добрый!!!
Не подскажите как сохранить открытую страницу браузера(интернет експлорер, мозилла фирофокс но лучше Интернет Експлорера) в текстовой файл?
То есть я в браузере открыл страницу например яндекса.ру, и мне надо сохранить открытую страницу в текстовой файл. Конечно программно, а не правая кнопка мышки, сохранить страницу...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2014, 20:18
Ответы с готовыми решениями:

Как скопировать содержимое Chart в Image?
Добрый день. Можно ли как-то скопировать содержимое Chart в Image??? Если да, то подскажите,...

Как скопировать содержимое файла в строку
Пример из делфи: // Копируем содержимое файла в строку S SetString(S,...

Скопировать содержимое файла в другой файл
Задан символьный файл F. Получить его копию в файле G.

Скопировать содержимое одного файла в другой файл
есть рабочий код нужно только доработать , помогите пожалуйста вот задание :Скопировать...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30867 / 20189 / 7874
Регистрация: 22.10.2011
Сообщений: 35,049
Записей в блоге: 6
10.09.2014, 22:13 2
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Находим среди всех окон Shell-а именно окно открытого IE, и сохраняем его содержимое в файл через IPersistStreamInit.
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
#include <mshtml.h>
#include <exdisp.h>
#include <utilcls.h>
 
#include <memory>
 
// ...
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CoInitialize(NULL);
 
    TComInterface<IShellWindows>psw;
    if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
        IID_IShellWindows, (void**)&psw)))
    {
        LONG nCount = 0;
        psw->get_Count(&nCount);
 
        IDispatch *pdisp;
        for (int i = 0; i < nCount; i++)
        {
            psw->Item((Variant)i, &pdisp);
 
            TComInterface<IWebBrowser2>pwb;
            if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowser2, (void**)&pwb)))
            {
                TComInterface<IDispatch>pDispDoc;
                pwb->get_Document(&pDispDoc);
                if (pDispDoc)
                {
                    WORD mode = fmCreate;
                    std::auto_ptr<TFileStream>stm
                        (new TFileStream("D:\\test\\page_UI.html", mode));
                    IPersistStreamInit *psi;
                    stm->Seek(0, soFromBeginning);
                    _di_IStream sa(*(new TStreamAdapter(stm.get(), soReference)));
                    if (SUCCEEDED(pDispDoc->QueryInterface(IID_IPersistStreamInit, (void **)&psi)))
                    {
                        psi->Save(sa, true);
                        psi->Release();
                    }
                }
            }
        }
        pdisp->Release();
    }
    CoUninitialize();
}
Проверялось на Builder XE2, работает прекрасно, страницу из MSDN только что мне сохранило в файл.
2
1089 / 587 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
15.09.2014, 08:10 3
как вариант (сохраняется исходный код страницы)
C++
1
2
Memo1->Text=IdHTTP1->Get("www.yandex.ru");
Memo1->Lines->SaveToFile("text.txt");
0
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 615
15.09.2014, 20:49  [ТС] 4
Цитата Сообщение от AntonChik Посмотреть сообщение
как вариант (сохраняется исходный код страницы)

C++
1
2
Memo1->Text=IdHTTP1->Get("www.yandex.ru");
Memo1->Lines->SaveToFile("text.txt");
Не пподходит, выдает ошибка 403.

Добавлено через 5 минут
Цитата Сообщение от UI Посмотреть сообщение
Проверялось на Builder XE2, работает прекрасно, страницу из MSDN только что мне сохранило в файл.
Спасибо все почти работает.
Если открывать простую страницу то есть где нет ни каких обработок(стартовая страница гоогла, мсдн, киберфору)
, а если где есть обработка (virustotal(не стартовую страницу, а после проверки файла)) то выдает пустую страницу, но если скопировать ссылку и по новой ее отрыть, то после открывания страница сохраняется.

Добавлено через 4 минуты
примерно вот в чем дело
При сохранении текста документа через IPersistFile следует помнить, что если содержимое документа изменялось после загрузки, например, с использованием методов объектной модели DHTML, то изменения не будут запомнены.
на шел такой метод, но не понял как применить.
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 CMyHtmlView::HtmlSaveText( IHTMLDocument2* pDoc, CString sFileName)
// Сохранить текст документа pDoc в файл sFileName
{
    USES_CONVERSION;
 
    // Получаем содержимое коллекции all
    CComQIPtr< IHTMLElementCollection, &IID_IHTMLElementCollection> pAll;
    pDoc->get_all( &pAll );
 
    CComBSTR bsAll;
    CComVariant v1( 0), v2;    
    CComQIPtr<IDispatch, &IID_IDispatch> pDisp;    
    pAll->item( v1, v2, &pDisp);
 
    CComQIPtr<IHTMLElement, &IID_IHTMLElement> pElement;
    pElement = pDisp;
    pElement->get_outerHTML( &bsAll);
 
    // Сохраняем полученную строку на диск
    ofstream to( (LPCSTR)sFileName);
    if (to)
    {
        CString sHtml( W2A( bsAll));
        to.write( sHtml, sHtml.GetLength());
        to.close();
    }
}
взял отсюда отсюда
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30867 / 20189 / 7874
Регистрация: 22.10.2011
Сообщений: 35,049
Записей в блоге: 6
15.09.2014, 21:43 5
Dr.Xank, не знаю, насколько это тебе поможет, применить можно вот так:
C++
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
                // Аналогично предыдущему коду находишь pDispDoc, я сохранил нумерацию строк
                if (pDispDoc)
                {
                    TComInterface<IHTMLDocument3> HTMLDoc;
                    pDispDoc->QueryInterface(IID_IHTMLDocument3, (void**)&HTMLDoc);
                    if (HTMLDoc)
                    {
                        WideString wHtmlCode;
 
                        wHtmlCode = HTMLDoc->documentElement->outerHTML;
                        std::auto_ptr<TStringStream> ss(new TStringStream(String(wHtmlCode)));
                        ss->SaveToFile("D:\\test\\page_UI2.html"); // Будет записано содержимое странички
 
                    }
                }
, но я не уверен, что после работы скриптов ты получишь результат... Попробуй, просто интересно. Без вычислений все нормально сохраняет (на IE8 и новее должно работать, с IE6/7 могут быть проблемы)...
0
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 615
15.09.2014, 22:03  [ТС] 6
Цитата Сообщение от UI Посмотреть сообщение
if (pDispDoc)
{
Цитата Сообщение от UI Посмотреть сообщение
Попробуй, просто интересно.
TComInterface<IHTMLDocument> HTMLDoc;
pDispDoc->QueryInterface(IID_IHTMLDocument3, (void**)&HTMLDoc);
if (HTMLDoc)
{
WideString wHtmlCode;
wHtmlCode = HTMLDoc->documentElement->outerHTML;
std::auto_ptr<TStringStream> ss(new TStringStream(String(wHtmlCode)));
ss->SaveToFile("D:\\test\\page_UI2.html"); // Будет записано содержимое странички
}
}
Вот как получилось
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
CoInitialize(NULL);
 
    TComInterface<IShellWindows>psw;
    if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
        IID_IShellWindows, (void**)&psw)))
    {
        LONG nCount = 0;
        psw->get_Count(&nCount);
 
        IDispatch *pdisp;
        for (int i = 0; i < nCount; i++)
        {
            psw->Item((Variant)i, &pdisp);
 
            TComInterface<IWebBrowser2>pwb;
            if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowser2, (void**)&pwb)))
            {
                TComInterface<IDispatch>pDispDoc;
                pwb->get_Document(&pDispDoc);
                if (pDispDoc)
                {
                    TComInterface<IHTMLDocument> HTMLDoc;
                    pDispDoc->QueryInterface(IID_IHTMLDocument3, (void**)&HTMLDoc);
                    if (HTMLDoc)
                    {
                        WideString wHtmlCode;
 
                        wHtmlCode = HTMLDoc->documentElement->outerHTML;
                        std::auto_ptr<TStringStream> ss(new TStringStream(String(wHtmlCode)));
                        ss->SaveToFile("D:\\test\\page_UI2.html"); // Будет записано содержимое странички
 
                    }
                }
            }
        }
        pdisp->Release();
    }
    CoUninitialize();
}
Выдает ошибку
Код
[bcc32 Error] Unit1.cpp(50): E2316 'documentElement' is not a member of 'IHTMLDocument'
  Full parser context
    Unit1.cpp(22): parsing: void _fastcall TForm1::Button1Click(TObject *)
на этой строке
C++
1
wHtmlCode = HTMLDoc->documentElement->outerHTML;
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30867 / 20189 / 7874
Регистрация: 22.10.2011
Сообщений: 35,049
Записей в блоге: 6
15.09.2014, 22:10 7
Упс, куда тройка делась?
C++
1
TComInterface<IHTMLDocument3> HTMLDoc; // а не IHTMLDocument
, конечно (поправил в предыдущем посте). И еще одно изменение, забыл сразу упомянуть, нужно заменить один хидер с H на HPP:
C++
1
2
// #include <mshtml.h>
#include <mshtml.hpp>
1
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 615
15.09.2014, 22:35  [ТС] 8
Цитата Сообщение от UI Посмотреть сообщение
, но я не уверен, что после работы скриптов ты получишь результат... Попробуй, просто интересно.
Все сохраняет. Спасибо))))

Только еще один вопрос, скрипт выполняется разное время(от 30 до 60 сек) как можно узнать закончил выполняться скрипт или нет?
Просто я буду открывать IE функцией
C++
1
ShellExecuteA()
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2014, 22:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Скопировать содержимое одного файла в другой файл
Скопировать содержимое одного файла в другой файл. Для копирования использовать функции блочного...

Скопировать содержимое файла в другой файл с помощью оператора For.. To.. Do
Имеется нетипизированный файл длиной 100 байт. Вывести его содержимое на экран. Скопировать его...

Как скопировать всё содержимое тега (включая другие теги и их содержимое) и вставить внутрь другого тега
Пробовал .clone $(&quot;.la_desktop&quot;).clone().appendTo(&quot;.la_mobile&quot;); HTML: &lt;div...

Содержимое нетипизированного файла вывести на экран и скопировать в другой файл
Имеется нетипизированный файл длиной 50 байт. Вывести его содержимое на экран. Скопировать его...


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

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

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