Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TWebBrowser- получение HTML [XP]


Alral ©   (2008-04-11 16:15:00) 

Здравствуйте.
У меня вопрос: как с помощью компонента WebBrowser получить только HTML-код страницы, не загружая ничего иного, и прочитать его?
Заранее спасибо.
С уважением, Александр.


ЦУП   (2008-04-13 17:27:00) [1]

Не надо WebBrowser.

////////////////////////////////////////////////////////////////////////////////
//
//  Демо получения HTML кода страницы
//  Автор: Александр (Rouse_) Багель
//  c Fangorn Wizards Lab 1998 - 2003
//  19 января 2003

unit GetUrl;

interface

uses
 Windows, Wininet;

const
 HTTP_PORT = 80;
 CRLF = #13#10;
 Header = 'Content-Type: application/x-www-form-urlencoded' + CRLF;

function GetPage(const URL: String): String;

implementation

function DelHttp(URL: String): String;
begin
 if Pos('http://', URL) > 0 then Delete(Url, 1, 7);
 Result := Copy(Url, 1, Pos('/', Url) - 1);
 if Result = '' then Result := URL + #0;
end;

function GetPage(const URL: String): String;
var
 FSession, FConnect, FRequest: HINTERNET;
 FHost, FScript, SRequest: String;
 Ansi: PAnsiChar;
 Buff: array [0..1023000] of Char;
 BytesRead: Cardinal;
 Res, Len: DWORD;
begin
 Result := '';
 // Небольшой парсинг
 // вытаскиваем имя хоста и параметры обращения к скрипту
 FHost := DelHttp(Url);
 FScript := Url;
 Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));
 //FScript := FHost + '/' +FScript;

 // Инициализируем WinInet
 FSession := InternetOpen('DMFR', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if not Assigned(FSession) then Exit;
 try
   // Попытка соединения с сервером
   FConnect := InternetConnect(FSession, PChar(FHost), HTTP_PORT, nil,
                               'HTTP/1.0', INTERNET_SERVICE_HTTP, 0, 0);
   if not Assigned(FConnect) then Exit;
   try
     // Подготавливаем запрос страницы
     Ansi := 'text/*';
     FRequest := HttpOpenRequest(FConnect, 'GET', PChar(FScript), 'HTTP/1.1',
                                 nil, @Ansi, INTERNET_FLAG_RELOAD, 0);
     if not Assigned(FConnect) then Exit;
     try
       // Добавляем заголовки
       if not (HttpAddRequestHeaders(FRequest, Header, Length(Header),
                                     HTTP_ADDREQ_FLAG_REPLACE or
                                     HTTP_ADDREQ_FLAG_ADD or
                                     HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA)) then Exit;

       // Проверяем запрос:
       Len := 0;
       Res := 0;
       SRequest := ' ';
       HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or
         HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);
       if Len > 0 then
       begin
         SetLength(SRequest, Len);
         HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or
           HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);
       end;
       // Отправляем запрос
       if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit;
       // Получаем ответ
       FillChar(Buff, SizeOf(Buff), 0);
       repeat
         Result := Result + Buff;
         FillChar(Buff, SizeOf(Buff), 0);
         InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);
       until BytesRead = 0;
     finally
       InternetCloseHandle(FRequest);
     end;
   finally
     InternetCloseHandle(FConnect);
   end;
 finally
   InternetCloseHandle(FSession);
 end;
end;

end.


palva   (2008-04-13 13:13:00) [2]

> А всё-таки как это осуществить?

То что вы просите, вряд ли возможно осуществить. Страничка уже разобрана и разложена по внутренним полочкам браузера. Браузер может  собрать страничку обратно, но это уже не будет оригиналом. Если хотите, можете попробовать такой код:

procedure TForm1.FormCreate(Sender: TObject);
begin
 WebBrowser1.Navigate('http://,,,,);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 document: IHTMLDocument2;
 docAll: IHTMLElementCollection;
 firstElement: IHTMLElement;
begin
 document := WebBrowser1.Document as IHTMLDocument2;
 if Assigned(document) then
 begin
   docAll := document.all;
   firstElement := docAll.Item(0,'') as IHTMLElement;
   Memo1.Text := firstElement.OuterHTML;
 end
end;


Palladin   (2008-04-13 12:07:00) [3]


>Alral ©(13.04.08 11:49) [12]


ну ведь сказали уже, используй WinInet. Он гораздо проще чем кажется.


Alral   (2008-04-13 11:49:00) [4]


> А почему обязательно через WebBrowser? Он, кстати, исказит
> код страницы, выбросит пустые строки, сделает отступы и
> т. д. Вам же этого не нужно.

А всё-таки как это осуществить?


Alral   (2008-04-12 01:33:00) [5]


> palva ©   (11.04.08 22:35) [8]
>
> > Мне именно надо загружать HTML-код страницы
> А почему обязательно через WebBrowser? Он, кстати, исказит
> код страницы, выбросит пустые строки, сделает отступы и
> т. д. Вам же этого не нужно.

Оформление кода мне в данный момент не важно. Важно только получить содержание для обработки самой программой.

> По-моему, надо прислушаться к [4] или есть такая функция
> URLDownloadToFile из модуля UrlMon (Delphi 7)

У меня Turbo Delphi 2006.


> Reindeer Moss Eater ©   (11.04.08 23:34) [10]

Но ведь для TCPClient необходимо знать IP, а у меня только URL


Reindeer Moss Eater   (2008-04-11 23:34:00) [6]

например, через TCPClient?

выставляем адрес + порт;
соединяемся;
райтэлн 'GET /index.htm HTTP/1.0';
райтэлн;

рипит
текст страницы := текст страницы + ридэлэн;
антил прочтиаем пустую_строку;

смотрим на строку content-length и если там ....

... а еще лучше смотрим прямо в рфц.


easy   (2008-04-11 22:38:00) [7]

http://dfc.com.ru/?sid=2&id=9&itemid=25


palva   (2008-04-11 22:35:00) [8]

> Мне именно надо загружать HTML-код страницы
А почему обязательно через WebBrowser? Он, кстати, исказит код страницы, выбросит пустые строки, сделает отступы и т. д. Вам же этого не нужно.
По-моему, надо прислушаться к [4] или есть такая функция URLDownloadToFile из модуля UrlMon (Delphi 7)


Alral   (2008-04-11 22:00:00) [9]


> AIK ©   (11.04.08 19:08) [6]
>
> Вобшета для этого подходит и Memo, типа Memo1.Lines.LoadFromFile('C:
> \Мастера DELPHI.htm'), а вот если вам надо через www загружать
> то не подойдет


Мне именно надо загружать HTML-код страницы с WWW. При этом другая "нагрузка" сайта (картинки, и т.п.) мне не нужна.


AIK   (2008-04-11 19:08:00) [10]

Вобшета для этого подходит и Memo, типа Memo1.Lines.LoadFromFile('C:\Мастера DELPHI.htm'), а вот если вам надо через www загружать то не подойдет


Alral   (2008-04-11 18:57:00) [11]


> Reindeer Moss Eater ©   (11.04.08 16:26) [3]
>
> С этим любой тсп клиент справится

Простите, не могли бы вы пояснить как это сделать, например, через TCPClient?


clickmaker   (2008-04-11 16:41:00) [12]


> [2] Alral ©   (11.04.08 16:23)

через WinInet Api тогда
там нескольки вызовов всего достаточно:
InternetOpen
InternetOpenUrl
InternetReadFile


Reindeer Moss Eater   (2008-04-11 16:26:00) [13]

С этим любой тсп клиент справится


Alral   (2008-04-11 16:23:00) [14]

Проблема в том, что Indy-компонентов у меня нет (т.к. Turbo Delphi 2006).


clickmaker   (2008-04-11 16:20:00) [15]

для этого не нужен брофзер
TIdHttp или InternetOpenUrl()


Наверх

Титульная страница Поиск, карта сайта Написать письмо