Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80

Как открыть HTML-страницу?

14.12.2010, 02:37. Показов 3717. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья, такой вопрос - как открыть HTML-страничку в своей программе и куда её при этом можно сохранить в памяти?

Имеется в виду: как получить текст HTML-страницы? Не исходник, а уже сформированный сервером код?
Выводить никуда на экран не надо, код мне нужен для последующей самостоятельной обработки. Хочу открывать нужную страницу и вытаскивать из неё нужную мне информацию.

И куда это дело сохранить можно - в массив строк (ну а куда же ещё, наверное)?

Как вообще такие вещи делаются? Если у кого есть опыт - поделитесь, пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2010, 02:37
Ответы с готовыми решениями:

Как открыть локальную HTML страницу в WebBrowser?
При попытке открыть из ресурсов программы просто ищет код странице в интернете. Страниц много, можно ли как нибудь из архива считать?

Как в Spring MVC открыть статическую html страницу
Вопрос пришел из предыдущего поста про ExtJS. Сборка клиента на ExtJS имеет в своем составе html файл после запуска которого далее...

Как открыть .html страницу для обработки, не скачивая её
Есть страница, мне нужно через Qt просмотреть её html код (не скачивая её) и скопировать оттуда некоторые вещи (там идет выборка, поиск...

6
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
14.12.2010, 06:27
Ну если на WinAPI - изучай сокеты
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
14.12.2010, 06:47
Ты форумного индексирующего бота что ли делаешь? С динамических сайтов никто тебе исходник и не передаст, а на статических исходник и есть готовый код. Так что, в любом случае тебе нужен html текст со всеми тегами. Подключай свой сокет на восьмидесятый порт сервака и качай ответ. Куда поместить - решай сам, может быть в массив строк, а может символов (в одну гигантскую строку с символами '\n' в любом месте), или даже в массив сырых байт.
1
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80
15.12.2010, 02:17  [ТС]
Спасибо! Буду мучать Гугл сокетами

Добавлено через 1 час 57 минут
А может кто подсказать, как откомпилировать простейшее winsock-приложение в DevC++? Нужно ли создавать проект? Какие параметры и библиотеки подключать и как?

Нашёл немало примеров в интернете - ни один не компилируется

Добавлено через 30 минут
А, понял: в св-вах проекта компоновщику надо было прописать "-lws2_32"

Добавлено через 2 часа 22 минуты
Друзья, нашёл на просторах интернета вот такой замечательный пример:
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
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
int main()
{
    WORD ver = MAKEWORD(2,2);
    WSADATA wsaData;
    int retVal=0;
 
    WSAStartup(ver,(LPWSADATA)&wsaData);
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("www.ya.ru");
 
    if(!hostEnt)
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        return 1;
    }
 
    //Ñîçäàåì ñîêåò
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(clientSock == INVALID_SOCKET)
    //if(clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return 1;
    }
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr = *((LPIN_ADDR)*hostEnt->h_addr_list);
    serverInfo.sin_port = htons(80);
 
    retVal=connect(clientSock,(LPSOCKADDR)&serverInfo, sizeof(serverInfo));
    if(retVal==SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        return 1;
    }
 
    printf("Connection made sucessfully\n");
 
    char *pBuf = "Request";
    //char *pBuf = "GET //index.html HTTP//1.0";
 
    printf("Sending request from client\n");
    retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        WSACleanup();
        return 1;
    }
 
 
    char szResponse[128];
    retVal = recv(clientSock, szResponse, 128, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        WSACleanup();
        return 1;
    }
 
    printf("Got the response from server\n%s\n",szResponse);
 
    closesocket(clientSock);
    WSACleanup();
    
    return 0;
}
При выполнении в переменную char szResponse[128]; программа помещает примерно следующий текст:
HTML5
1
<html><head><title>400 Bad Request</title> bla-bla-bla
Вопрос - почему? А как получить нормальный код страницы, а не "неправильный запрос"?
(для pBuf пробовал оба варианта, включая закомментированный - результат одинаков)

Добавлено через 1 час 0 минут
Так, кажись, я нашёл готовое решение ^_^

Добавлено через 51 минуту
О! Работает! ^_^

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
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
 
int main()
{
    WORD ver = MAKEWORD(2,2);
    WSADATA wsaData;
    int retVal=0;
 
    WSAStartup(ver,(LPWSADATA)&wsaData);
 
    LPHOSTENT hostEnt;
 
    hostEnt = gethostbyname("www.ya.ru");
 
    if(!hostEnt)
    {
        printf("Unable to collect gethostbyname\n");
        WSACleanup();
        return 1;
    }
 
    //Ñîçäàåì ñîêåò
    SOCKET clientSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(clientSock == INVALID_SOCKET)
    //if(clientSock == SOCKET_ERROR)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return 1;
    }
 
    SOCKADDR_IN serverInfo;
 
    serverInfo.sin_family = PF_INET;
    serverInfo.sin_addr = *((LPIN_ADDR)*hostEnt->h_addr_list);
    serverInfo.sin_port = htons(80);
 
    retVal=connect(clientSock,(LPSOCKADDR)&serverInfo, sizeof(serverInfo));
    if(retVal==SOCKET_ERROR)
    {
        printf("Unable to connect\n");
        WSACleanup();
        return 1;
    }
 
    printf("Connection made sucessfully\n");
 
    //char *pBuf = "Request";
    char *pBuf = "GET /index.html HTTP/1.0\r\nHost: www.ya.ru\r\n\r\n";
 
    printf("Sending request from client\n");
    retVal = send(clientSock, pBuf, strlen(pBuf), 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        WSACleanup();
        return 1;
    }
 
 
    char szResponse[1024];
    retVal = recv(clientSock, szResponse, 1024, 0);
 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        WSACleanup();
        return 1;
    }
 
    printf("Got the response from server\n%s\n",szResponse);
 
    closesocket(clientSock);
    WSACleanup();
    
    return 0;
}
Добавлено через 45 минут
Добавил приём кусков буфера, пока не кончатся - почему-то читает html-документ не до конца, или я что-то не понимаю

C
1
2
3
#define MAX_PACKET_SIZE 4096
while ( ( retVal = recv(clientSock, szResponse, MAX_PACKET_SIZE, 0) ) != 0 )
          printf("%s", szResponse );
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
15.12.2010, 05:16
TrenAr, Ну может получиться, что ты запрашиваешь очередные данные, а они просто не успели придти, и ты берешь и выходишь. Для таких вещей используется таймаут, если за время таймаута не пришло ни одного пакета, то значит прием закончен.
0
21 / 20 / 3
Регистрация: 21.06.2010
Сообщений: 80
15.12.2010, 20:15  [ТС]
Что за таймаут? Просто сделать цикл с паузой и каждые N-секунд той же командой recv проверять не пришло ли что ещё?
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
15.12.2010, 20:37
TrenAr, лучше таймер запустить, но на худой конец цикл сделай, главное не забудь в цикле sleep поставить, иначе твоя прога сожрет весь проц. )

Добавлено через 7 минут
TrenAr, тут еще важно какие сокеты ты используешь, синхронные или асинхронные.

если синхронные то похорошему нужно делать на сокет два дополнительных потока. один для приема, другой для передачи. Тот который для приема, принимает все что пришлют и формирует событие для главного потока. В главном потоке таймер сохраняет время когда последний пакет был получен и по истечению определенного времени говорит пользователю что все загружено. Учитывай. что вызвав recv блокирует поток пока не получит нужного числа байт.....если я правильно помню...

если сокет асинхронный, то просто ждешь событие приема пакетов и так же по таймеру отсчитываешь таймаут.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.12.2010, 20:37
Помогаю со студенческими работами здесь

Открыть HTML-страницу в браузере
Привет. есть html-страница на D:\\1.html как открыть ее в браузере? пробровал QDesctopServices::OpenUrl(); не открывает ...

Открыть HTML-страницу нажатием на кнопку
Здравствуйте, подскажите пожалуйста. На форме у меня есть кнопка &quot;Открыть HTML-страницу. Как мне сделать так, чтобы я нажала на эту кнопку...

Открыть html страницу в папке с прогой.
Как открыть страницу на лок. компе. WBrowser не открывает страницу в папке с программой- Пишет что &quot;Переход отменен&quot; private...

Открыть с помощью компонента WebBrowser HTML страницу
Добрый вечер! помогите пожалуйста открыть с помощью компонента webbrawser HTML страницу находящийся в той же папке где находится и сама...

При вызове справки открыть html-страницу в браузере
В общем хочу чтобы при вызове справки открывалась html-страница в браузере. Как это сделать? P.S. Строка вида Shell(&quot;explorer...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru