C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Парсинг HTML в древовидную структуру
SomewhereSomehow
Отправлено: 03.11.2004, 13:37


Ученик-кочегар

Группа: Участник
Сообщений: 18



Уважаемые посетители форума может кто подскажет... Требуется реализовать парсинг хтмл файла в древовидную структуру, где каждый элемент дерева это таг с какими-то свойствами и пр. Проблема заключается в том что многие страницы написаны синтаксически не верно (не закрытые таги, или лишние закрывающие таги и пр.) что затрудняет определение области действия того или иного тага. Например в перле и жаваскрипте есть уже стандартные готовые функции которые парсят любые хтмл страницы в дерево (по-моему они так и называются HTML::TreeBuilder и HTML::Element) соответственно вопрос есть ли что-то подобное для билдера. Решения типа "поискать компонент на торри.нет" или "утилиткой типа tidy переконвертить html в xml а потом передать это xml парсеру" не катят. Нужно либо компонент парсер хтмл либо компонент с интерпретатором перла или жаваскрипта ну или если знаете как можно иначе решить проблему с удовольствием выслушаю! Спасибо.
Guest
Отправлено: 03.11.2004, 13:53


Не зарегистрирован







Отдать текст Webброузеру и попросить результат biggrin.gif
SomewhereSomehow
Отправлено: 03.11.2004, 14:04


Ученик-кочегар

Группа: Участник
Сообщений: 18



Как ты себе это представляешь?
Guest
Отправлено: 03.11.2004, 14:12


Не зарегистрирован







Отдаем TCppWebBrouserу и просим collection all. Как это сделать технически пока не знаю. Надо почитать инфу. Но знаю, что можно.
SomewhereSomehow
Отправлено: 03.11.2004, 14:34


Ученик-кочегар

Группа: Участник
Сообщений: 18



Спасибо, попробую покопатьсся в этом направлении...
SomewhereSomehow
Отправлено: 03.11.2004, 17:51


Ученик-кочегар

Группа: Участник
Сообщений: 18



Ура! Спасибо за подсказку! Все замечательно парсится и работает!!!
Guest
Отправлено: 03.11.2004, 18:40


Не зарегистрирован







а можно образец кода получения all
SomewhereSomehow
Отправлено: 04.11.2004, 14:27


Ученик-кочегар

Группа: Участник
Сообщений: 18



Кусок статьи из инета неизвестного автора

CODE


30.10.2002 — Пример кода для работы с Internet Explorer с использованием COM интерфейсов (Второе приближение)

В данном примере предлагается к рассмотрению программный код для работы с Internet Explorer, а именно PARSER (распознаватель) HTML страниц. Из него многое вырезано от оригинала (возможно опубликую позже), но оставленного надеюсь достаточно для понимания

Используемые компоненты


TCppWebBrowser *CppWebBrowser;

//здесь будет приведена пример функции обработки события DocumentComplete

void __fastcall TTWEBForm::CppWebBrowserDocumentComplete(TObject *Sender, LPDISPATCH pDisp, TVariant *URL)
  {    
  //здесь мы обьявим несколько указателей на интерфейсы
  //вообще все дальнейшие объявляемые указатели есть как правило на интерфейсы
  //самый из них указатель типа IUnknown универсальный указатель на любой интерфейс

  HRESULT hr;
  IUnknown* pUnkBrowser = NULL, * pUnkDisp = NULL, * pDocDisp = NULL;
  IHTMLDocument2* pDoc = NULL;

  //делаем проверку на наличие неизвестного интерфейса браузера  
  if (SUCCEEDED(CppWebBrowser->ControlInterface->QueryInterface(IID_IUnknown, (void**)&pUnkBrowser)))
     {
     //проверяем наличие неизвестного интерфейса в интерфейсе браузера
     if (SUCCEEDED(pDisp->QueryInterface(IID_IUnknown, (void**)&pUnkDisp)))
        {
        //проверяем на правильность полученных указателей на интерфейсы
        if (pUnkBrowser == pUnkDisp)
           {
           //теперь все в порядке и можно работать с документов загруженным  в браузер
           //только надо для начала получить указатель на интерфейс
           if (SUCCEEDED(CppWebBrowser->ControlInterface->get_Document(&pDocDisp)))
              {
              if (SUCCEEDED(pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc)))
                 {
                 //теперь у нас есть указатель на интерфейс обрабатываемого документа
                 //давайте например возьмем все ссылки из данного документа
                 IHTMLElementCollection * pElemColl;
                 //берем набор всех  элементов
                 if(SUCCEEDED(pDoc->get_all(&pElemColl)))
                    {
                    long k;
                    IHTMLAnchorElement  *pAnchorElem;
                    IDispatch *pmDisp;
                    BSTR innerText;
                    if(SUCCEEDED(pElemColl->get_length(&k)))
                       {
                        for(long i = 0; i < k; i++)
                             {
                              pElemColl->item(TVariant(i), TVariant(0), &pmDisp);
                              if(SUCCEEDED(pmDisp->QueryInterface(IID_IHTMLAnchorElement, (void**) &pAnchorElem)))
                                 {
                                 pAnchorElem->get_innerText(&innerText);
                                 if(innerText)
                                    {
                                    AnsiString Result(WideString(innerText));
                                    //в данном месте мы как раз получили ссылку из документа
                                    //вообще в этом цикле мы можем получить любую информацию от Parser`а
                                    //теперь осталось прибраться за собой
                  //не надо забывать освобождать интерфейсы, иначе они остануться в памяти
                                    SysFreeString(innerText);
                                   }
                                pAnchorElem->Release();
                                }
                             }                          
                       }
                       pElemColl->Release();
                    }
                 pDoc->Release();                  
                 }
              pDocDisp->Release();
              }              
           }
           pUnkDisp->Release();
        }
        pUnkBrowser->Release();
     }
  }
Guest
Отправлено: 04.11.2004, 15:15


Не зарегистрирован







Пасиба smile.gif

Вернуться в Вопросы программирования в C++Builder