HTML из WebBrowser как лучше дернуть
Суть вопроса:
Есть страница(допустим ya.ru), нужно, чтобы можно было выдерать хтмл код страницы, и анализировать(ну с анализом сам справлюсь).Самое главное каким образом выдернуть код?При чем код должен быть полностью, и проверка на законченость страницы в этом не помогает, чем руководствоваться уже не знаю. Пробовал качать дополнительные компоненты....особо не помогло...
-----------------------------------------
1.Как выдернуть ХТМЛ код с любой страницы?(взятой с интернета, а не с локального источника)
2.Как узнать что загрузка страницы(именно страницы а не фрейма) закончилась?
-------------------------------------------------
З.Ы. Юзаю Borland Delphi 7
Код:
IHTMLDocument2(WebBrowser1.Document).body.innerHTML
Только он вернёт только body страницы, без заголовка (head).
Хотя и на этом большое спасибо=)
Осталась решить как узнать что страница загрузилась.
Цитата: CrazyTimon
Осталась решить как узнать что страница загрузилась.
Обрабатывать OnDocumentComplete, пример есть в справке и тут (правда на С++).
Пробовал.....он скорее всего реагирует не на весь документ а на фрейм
Собственно, если вам нужно код получить, то почему бы не получить его через TcpClient?
Код:
// коннектимся
TcpClient1.RemoteHost:='ya.ru';
TcpClient1.RemotePort:= '80';
TcpClient1.Connect;
// OnConnect
s:='GET / HTTP/1.0'+#13#10+#13#10;
TcpClient1.Sendln(s, '');
s:=TcpClient1.Receiveln(''); // в s будет html-код
TcpClient1.RemoteHost:='ya.ru';
TcpClient1.RemotePort:= '80';
TcpClient1.Connect;
// OnConnect
s:='GET / HTTP/1.0'+#13#10+#13#10;
TcpClient1.Sendln(s, '');
s:=TcpClient1.Receiveln(''); // в s будет html-код
Понятно, конечно, что будет присутствовать заголовок ответа сервера, но его можно отделить.
Цитата:
Я так понял, что нужно через WebBrowser, но все же.
Собственно, если вам нужно код получить, то почему бы не получить его через TcpClient?
Код:
// коннектимся
TcpClient1.RemoteHost:='ya.ru';
TcpClient1.RemotePort:= '80';
TcpClient1.Connect;
// OnConnect
s:='GET / HTTP/1.0'+#13#10+#13#10;
TcpClient1.Sendln(s, '');
s:=TcpClient1.Receiveln(''); // в s будет html-кодПонятно, конечно, что будет присутствовать заголовок ответа сервера, но его можно отделить.
Собственно, если вам нужно код получить, то почему бы не получить его через TcpClient?
Код:
// коннектимся
TcpClient1.RemoteHost:='ya.ru';
TcpClient1.RemotePort:= '80';
TcpClient1.Connect;
// OnConnect
s:='GET / HTTP/1.0'+#13#10+#13#10;
TcpClient1.Sendln(s, '');
s:=TcpClient1.Receiveln(''); // в s будет html-кодПонятно, конечно, что будет присутствовать заголовок ответа сервера, но его можно отделить.
Максимальная длина строки в Delphi - 255 символов. Длина большинства веб-страниц намного больше. А ReceiveLn возвращает именно String. В этом случае надо пользоваться ReceiveBuf.
Цитата: KIV
Максимальная длина строки в Delphi - 255 символов. Длина большинства веб-страниц намного больше. А ReceiveLn возвращает именно String. В этом случае надо пользоваться ReceiveBuf.
хех, если нет директивы компилятора {$H-}, то в Delphi string - это AnsiString и, соответвенно, может содержать ~2^31 символов, а это до 2Гб
TIdHTTP.Get вернет в строку весь хтмл код вроде.
P.S. можно и Post'ом
Спс попробую завтра, надеюсь что способ предложенный kosfiz'ом поможет, и решит проблему с проверкой загруженности страницы(что страница загрузилась полностью, либо что сервер закочнил отвечать). По поводу TIdHTTP.Get не совсем понял к какому объекту это применяется в webbrowser'у или к TcpClient'у?
Цитата: CrazyTimon
По поводу TIdHTTP.Get не совсем понял к какому объекту это применяется в webbrowser'у или к TcpClient'у?
Ни к тому ни к другому не относится.
Будет как-то вот так:
Код:
uses
...,
IdHTTP,
...;
var
http_client: TIdHTTP;
source_code: string;
{ много может быть всего}
http_client:= TIdHTTP.Create(nil);
source_code:= http_client.Get('http://ya.ru'); //в source_code html-код страницы
{опять же много всего}
...,
IdHTTP,
...;
var
http_client: TIdHTTP;
source_code: string;
{ много может быть всего}
http_client:= TIdHTTP.Create(nil);
source_code:= http_client.Get('http://ya.ru'); //в source_code html-код страницы
{опять же много всего}
да, TIdHTTP - это отдельный компонент. Искать на вкладке Indy (вроде там он живет). Хотя не уверен что инди входят во все версии дельфей.
Цитата: CrazyTimon
Пробовал.....он скорее всего реагирует не на весь документ а на фрейм
Значит не правильно пробовал:) Там как раз отлавливается "полная" загрузка страницы.
Цитата: Washington
Хотя не уверен что инди входят во все версии дельфей.
а если не входит (но в широкораспространенную ;) 7-ку конечно же входит) то можно (и даже нужно, и даже если входит :)) скачать новый билд 10й версии и поставить вместо 9.