Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/58: Рейтинг темы: голосов - 58, средняя оценка - 4.81
8 / 8 / 1
Регистрация: 18.10.2010
Сообщений: 120

Веб-браузер, парсинг в общем работа с веб-страничками!

22.08.2012, 15:46. Показов 12111. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте! Вот тут решил попрактиковаться в работе с WebBrowser..

Постановка задачи:
Открыл я свой браузер открыл страницу: WebBrowser1->Navigate("URL");
Страница загрузилась. На ней есть кнопка которую по задумке мне потребуется нажать, эта кнопка открывает другую страницу, причем не в этой же вкладке, а в другой.

Проблема:
Эта страница открывается в Internet Explorer, надо в моем же приложении.

Вопрос:
Как организовать открытие подобных страниц в моем же приложении?! Что то читал про PageControl, но не понял как его связать.. как после нажатия кнопки создать в нем новую страницу и как сделать что бы в ней открылась та страница?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2012, 15:46
Ответы с готовыми решениями:

веб браузер на borland c++
веб браузер на borland c++ как узнать размер открито сайта. Сколько килобайтов.

Какой веб браузер стоит по умолчанию
Сабж. Как узнать какой ВБ стоит по умолчанию?

Веб-браузер в черно-белых тонах
Стоит задача реализовать интерфейс(браузер) для дальтоников грубо говоря. Вопрос в тыл... Сам браузер и кнопочки сделал, зум для плохо...

46
8 / 8 / 1
Регистрация: 18.10.2010
Сообщений: 120
24.08.2012, 17:15  [ТС]
Студворк — интернет-сервис помощи студентам
Вот это:
Delphi
1
2
3
// Для надежности работаем со всеми фреймами, как с междоменными:
      Doc := CrossDomainFrame(WebBrowser1.Document as iHTMLDocument2,
                              iCurr).document as iHTMLDocument2;
Делает вот это:
Delphi
1
2
3
iCurr := i;
      Disp := Frames.item(iCurr);
      OleCheck(Disp.QueryInterface(IID_IHTMLWindow2, Frame));
только для междоменного фрейма?

Я просто не могу понять где используется Frame полученный в этих трех строчках..

и получается что вместо вот этого всего:
C++
1
2
3
4
5
6
7
8
9
if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
                    {
                        IHTMLWindow2 *pWindow = NULL;
                        if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2, (LPVOID*)&pWindow))) //Если фрейм найден
                        {
                            //pWindow->
                            IHTMLDocument2 *pDoc = NULL;
                            if(SUCCEEDED(pWindow->get_document(&pDoc)))
                            {
Мне нужен аналог функции из Делфи?

Добавлено через 29 минут
В общем вот что у меня получилось в попытках перевести функцию с Delphi:

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
for(long frameIx = 0; frameIx < CountFrame; frameIx++)
                {
 
                    //vFrame.lVal = frameIx;
                    TComInterface<IEnumUnknown> Enumerator;
                    TComInterface<IOleContainer> theContainer;
                    TComInterface<IUnknown> unknownFrame;
                    pDocument->QueryInterface(IID_IOleContainer,(LPVOID*) &theContainer);
                    theContainer->EnumObjects(OLECONTF_EMBEDDINGS,&Enumerator);
                    Enumerator->Skip(frameIx);
                    Enumerator->Next(1, &unknownFrame, NULL);
                    IWebBrowser2 *pWindow;
                    unknownFrame->QueryInterface(IID_IWebBrowser2,(LPVOID*) &pWindow);
 
 
                    /*if(SUCCEEDED(pFrames->item(&vFrame, &ret)))
                    {
                        IHTMLWindow2 *pWindow = NULL;
                        if(SUCCEEDED(ret.pdispVal->QueryInterface(IID_IHTMLWindow2, (LPVOID*)&pWindow))) //Если фрейм найден
                        {
                            //pWindow->*/
                           /*   IHTMLDocument2 *pDoc = NULL;
                            if(SUCCEEDED(pWindow->get_document(&pDoc)))
                            {
                            TComInterface<IHTMLElementCollection> pCollection;
                            pDoc->get_all(&pCollection);                                   //Получаю набор всех елементов в фрейме
                            if( pCollection )                                                   //если элементы есть
                            {
                                TComInterface<IDispatch> pDisp;
                                pCollection->item(TVariant(WideString("like")), TVariant(0), &pDisp); //Получаю елемент с ID или name "like"
                                if( pDisp )
                                {
                                    TComInterface<IHTMLElement> pElement;
                                    pDisp->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElement);
                                    if( pElement )                                                //Если ээлемент есть то счелкаю его
                                    {
                                        pElement->click();
                                    }
                                }
                            }
                            }
                        }
                    }*/
На строчках:
C++
1
2
IWebBrowser2 *pWindow;
                    unknownFrame->QueryInterface(IID_IWebBrowser2,(LPVOID*) &pWindow);
Компилятор выдал два сообщения об неопределенности:
[BCC32 Error] Unit1.cpp(72): E2015 Ambiguity between 'IWebBrowser2' and 'Shdocvw::IWebBrowser2'
[BCC32 Error] Unit1.cpp(73): E2015 Ambiguity between 'IID_IWebBrowser2' and 'Shdocvw::IID_IWebBrowser2'
Ну, а дальше в зависимости от причины это ошибки я либо знаю либо не знаю, как дальше вытащить ссылку..
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33460 / 21560 / 8248
Регистрация: 22.10.2011
Сообщений: 37,017
Записей в блоге: 12
24.08.2012, 20:20
Лучший ответ Сообщение было отмечено как решение

Решение

Вот проект. Только что запустил его на специально созданной страничке, и он прекрасно нашел на чужом фрейме нужную ссылку.
Вложения
Тип файла: zip simple.zip (9.6 Кб, 29 просмотров)
3
8 / 8 / 1
Регистрация: 18.10.2010
Сообщений: 120
24.08.2012, 20:29  [ТС]
UI, Спасибо большое! Обязательно разберусь! И буду н раз тренироваться на разных страничках чтобы закрепить полученный материал!

И последний вопрос: Есть вообще литература (все равно на каком языке), в которой бы нормально объяснялись WebBrowser и его методы, парсинг на C++ builder и тому подобное? мне как то трудно приступая к абсолютно новой области в C++ используя справку разобраться.. там написана функция и черт её знает как её применять толком.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2012, 20:35
Можно еще использовать IdHTTP парсить boost/regex или специальными библиотеками типа libxml2
0
8 / 8 / 1
Регистрация: 18.10.2010
Сообщений: 120
25.08.2012, 20:11  [ТС]
Можно если я так получил какой нибудь блок div (Например: <div id="dle-content"></div>):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    TWebBrowser *CppWB = WebBrowser1;
    IHTMLDocument2 *pHTMLDocument = NULL;
    if(SUCCEEDED(CppWB->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHTMLDocument)))
    {
        TComInterface<IHTMLElementCollection> pCollection;
        if (SUCCEEDED (pHTMLDocument->get_links(&pCollection)))
        {
        TComInterface<IDispatch> pDiv;
            pCollection->item(TVariant(WideString("dle-content")), TVariant(0), &pDiv);
            if (pDiv)
            {
 
            }
        }
    }
Потом получить все ссылки из него?
По типу чего нибудь такого:
C++
1
2
3
 
    TComInterface<IHTMLElementCollection> pLinks;
        if (SUCCEEDED (pHTMLDocument->get_links(&pLinks)))
Пытался так дальше делать:
C++
1
2
3
4
5
6
7
8
9
10
11
                TComInterface<IHTMLElement> pElemDiv;
                pDiv->QueryInterface(IID_IHTMLElement, (LPVOID*)&pElemDiv);
                if (pElemDiv)
                {
                    TComInterface<IDispatch> pDivLinks;
                    pElemDiv->get_all(&pDivLinks);
                    if(pDivLinks)
                    {
 
                    }
                }
Но длину pDivLinks получить нельзя, следовательно, как я понимаю, я что то не то получил
0
8 / 8 / 1
Регистрация: 18.10.2010
Сообщений: 120
27.08.2012, 10:11  [ТС]
Что мне написать в скобках catch, что бы на строчке

C++
1
IdHTTP1->Head(strHTMLWallpaper);
,

в случае отсутствия файла strHTMLWallpaper, не зависало, а тихо выходило и продолжало дальше действия располагающиеся после catch блока?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
try
{
    IdHTTP1->Head(strHTMLWallpaper);
    if(IdHTTP1->ResponseCode==200)
    {
        TFileStream* FILE_STREAM = new TFileStream(Edit2->Text+"\\image-"+NameFile+".jpg", fmCreate | fmOpenWrite);
        IdHTTP1->Get(strHTMLWallpaper, FILE_STREAM);
        CountDown++;
        delete FILE_STREAM;
    }
}
catch()
{
}
0
8 / 8 / 1
Регистрация: 18.10.2010
Сообщений: 120
28.08.2012, 20:46  [ТС]
А как мне получить элемент у которого нет ID или NAME, а есть например тэг HREF?

Например:
HTML5
1
<a href="link.html"></a>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2012, 20:46

Веб-браузер, периодически открывающий страницы и выполняющий поиск по ключевым словам
Доброго времени суток. Вопрос такой: есть браузер на c++ builder и нужно сделать так, чтобы он с каким-то интервалом времени открывал...

Работа с веб камерой
Здрасьте. Пробую захват изображения с вебкамеры(Genius iLook 300). нарыл такой код: HWND hWndC; ...

Работа с веб-камерой, видеосвязь
доброго времени суток! передо мной стоит задача организовать общение по веб-камере между двумя компьютерами через интернет. посоветуйте...

Работа с данными веб страниц
Здраствуйте. Подскажите новичку! Как мне пропарсить какую нибудь веб страницу, получить с нее данные и вставить в эти данные например в...

Одновременная работа с двумя одинаковыми веб-камерами
Здраствуйте! Начинаю разрабатывать приложение. Приложению необходимо одновременно работать с двумя одинаковыми веб камерами. Вопрос в том...


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru