Сегодня опишу самый простой способ получить содержимое web-страницы. Для этого будем использовать стандартный Active-X компонент TWebBrowser. Этот же компонент использует Windows в своем IE. В некоторых случаях это даже удобно, так как созданный на основе этого компонента объект будет "видеть" все ваши IE-кукисы и прочие настройки (если, конечно, вы пользуетесь IE).
Итак, создадим форму, на нее поместим TEdit (подобие адресной строки), кнопку и компонент TWebBrowser (вкладка Internet).
В обработчике нажатия кнопки пишем:
WebBrowser1.Navigate(Edit1.Text);
Вот и все!
Этот компонент удобен в случаях, когда HTML-код страницы нельзя получить другим простым способом (например, некоторые сайты отказываются работать, когда браузер не поддерживает flash, поэтому получить код страницы в обход применения этого компонента — возможности нет). Также TWebBrowser удобен для автоматизации работы с формами на сайтах.
Иногда требуется, чтобы страница полностью отобразилась в контейнере, прежде чем продолжится работа с ней. В этом случае я обычно в проекте создаю глобальную переменную, на событие OnDocumentComplete вешаю обработчик:
procedure TFMain.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
DocLoaded := true;
end;
А в теле основного модуля работа продолжается только тогда, когда эта глобальная переменная станет равна true:
procedure TFMain.PostMessageOnBoard(Mess: string);
var
Doc : IHTMLDocument2;
S : string;
begin
DocLoaded := false;
WebBrowser1.Navigate(Edit1.Text);
while DocLoaded = false do
Application.ProcessMessages;
Doc := WebBrowser1.Document as IHTMLDocument2;
WebBrowser1.OleObject.document.getElementById('shform').ClassName := '';
S := Doc.body.innerHTML;
//...
end;
Кстати, в приведенном выше отрезке кода содержится пример использования объектной модели браузера. (Что это — я расскажу позже.) А в переменной S в результате окажется весь HTML-код страницы.
В ближайших постах я планирую рассказать:
- Что такое объектная модель браузера и с чем ее едят?
- Как еще можно получить содержимое страницы?
- Написание простенького парсера (Пример №1 - Парсинг ключевых слов).
А я делаю так:
ОтветитьУдалитьwhile WebBrowser.ReadyState<READYSTATE_COMPLETE
do Application.ProcessMessages;
Ну, по-хорошему, про использование Application.ProcessMessages вообще лучше забыть - дёргать странички в потоке с помощью WinInet и потом обрабатывать, но, цель поста была не в этом :)
ОтветитьУдалитьругается на IHTMLDocument2.
ОтветитьУдалитьНеизвестный идентификатор
Добавьте библиотеку MSHTML.
ОтветитьУдалить>> S := Doc.body.innerHTML;
ОтветитьУдалитьв данном случае сохраняется только содержимое между тегами "body"
я для сохранения использую
S := WebBrowser.OleObject.document.all.tags('html').item(0).innerHTML;
кстати при таком сохранении есть непонятный нюанс - происходит капитализация всех тегов
как победить эту беду?
Alex, я использую то, что мне надо :) Вы вправе сохранять так, как угодно вам.
ОтветитьУдалить>я использую то, что мне надо
ОтветитьУдалитьсогласен :-)
вопрос не в этом
я использую объектную модель браузера для изменения страницы, а потом хочу сохранить весь результат. получается сохранить только через .innerHTML. НО как сохранить чтоб все теги были меленькими буквами ???
подскажите плиз где взять и как добавить библиотеку MSHTML.
ОтветитьУдалитьОна, вроде, входит в базовую комплектацию. Надо просто добавить ее в uses.
ОтветитьУдалитьMSHTML - библиотека типов. нужно импортировать. в delphi 2010: меню Component / Import Component... /Import Type Library/Microsoft HTML Object Library
ОтветитьУдалитьв других дельфях не знаю, гугл в помощь
Alex, спасобо за комментарий) Я в 10-ых делфях не работала, а семерке никакой импорт не требуется.
ОтветитьУдалитьмогу ошибатся, но вроде и в делфи 7 нужно импортировать.
ОтветитьУдалитьфайлик MSHTML_TLB.pas из ниоткуда не возьмется...
Нет, в седьмых не надо, 100%. И там не MSHTML_TLB.pas, а MSHTML.pas.
ОтветитьУдалить