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