Чем модно парсить HTML?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Чем модно парсить HTML?

Сообщение Vinechka » 14.02.2006 (Вт) 14:06

VS 2005, FW 2.
Собственно имеем хтмл страничку. В ней куча всего, но меня интересует одна табличка. Чем бы мне её поудобнее выковырнуть? Проще/удобнее RegEx есть что-нить для этого?

Эта табличка всегда с одним и тем же кол-вом столбцов, но количество строк постоянно меняется. + это не единственная табличка на странице (хотя такой структуры единственная - остальные это менюшки всякие).

Засовывать HTML в WebBrowser не получится, так как имеющийся там JScript вызывает ошибки и появляются окна, которые вообще нафиг не нужны.
В общем посоветуйте что-нить... может можно как-нить отключить вывод любых сообщений от вэбброузера? Или есть более человеческий способ разложить хтмл по полочкам?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.02.2006 (Вт) 14:22

Конечно, MSHTML. В .net есть аналог.
Код: Выделить всё
Dim doc as IHTMLDocument
Set doc = New HTMLDocument
doc.write htmlstring
Лучший способ понять что-то самому — объяснить это другому.

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 14.02.2006 (Вт) 14:46

Antonariy писал(а):Конечно, MSHTML. В .net есть аналог.
Код: Выделить всё
Dim doc as IHTMLDocument
Set doc = New HTMLDocument
doc.write htmlstring


HTMLDocument has no constructors. пытался с ним поиграться, так как вижу, что то что надо... но все время упирался в это. Чтобы сделать doc.write - пишет что надо использовать New, использую New - пишет что у класса нет конструктора. Засада.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.02.2006 (Вт) 14:54

Нет под рукой .net, но в вб6 это работает.
Попробуй просто любым способом создать doc и сделать doc.documentElement.outerHTML = htmlstring

Или подключи обычный mshtml
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.02.2006 (Вт) 14:57

Подключил-то что? Просто HTMLDocument - COM, и у него не может не быть конструкторов...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 14.02.2006 (Вт) 15:23

О! Подключил COM - заработало. До этого нашел в .Net mshtml версии 7, более того, ничего не подключая в Windows.forms оказывается еще был HTMLDocument :lol: С ним-то такая ерунда и была. Спасибо, что про ком напомнил - залез на соответствующую вкладку и нашел его :)

Вот только сделав как Antonariy написал у меня при наборе doc. не появляется список процедур и свойств объекта. Чего (а точнее где, а то полазил не въехал) подключить-то надо? Я, конечно и так смогу, но не удобно ж, ё-моё.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.02.2006 (Вт) 15:30

Ну как HTMLDocument объяви...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.02.2006 (Вт) 15:32

Ну как HTMLDocument объяви...
Тогда write работать не будет... По крайней мере в COM...
Лучший способ понять что-то самому — объяснить это другому.

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 14.02.2006 (Вт) 15:38

GSerg писал(а):Ну как HTMLDocument объяви...

Если написать вот так:
Код: Выделить всё
Dim doc As mshtml.HTMLDocument
doc = New mshtml.HTMLDocument
doc.write(mInfo.GetCalls("13.02.2006", "14.02.2006"))


То вылезает Type mismatch (GetCalls возвращает html страничку as string). :? (он при этом в Write хочет чтоб ему blah-blah() as object давали (где ж мне взять :lol: ).

Ну и ладно, объявлю как было, лишь бы работало, а остальное в Object Browser смотреть буду. ну можно еще для удобства еще один объект создать, в нем смотреть чего там где есть, а приписывать уже к работоспособному.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.02.2006 (Вт) 15:45

Dim d As mshtml.IHTMLDocument2
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vinechka
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 381
Зарегистрирован: 10.05.2005 (Вт) 4:07
Откуда: Москва

Сообщение Vinechka » 14.02.2006 (Вт) 15:50

Оппа! Работает! Спасибо! (гыы, выяснил, никонец-таки как надо чего объявлять).
Вчера вечером пытался разобраться (применительно к текущей задаче) с RegEx. Через 15 минут понял, что без поллитра не разберешь. Сходил купил пива и сел разбираться. Результат: лег спать в стельку пьяным, но по прежнему не решившим задачу :lol:

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 14.02.2006 (Вт) 15:51

Я так понимаю, IHTMLDocument является "накопительным" для всех остальных от 2 до 5, и объявлять нужно именно им.
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.02.2006 (Вт) 21:57

Я так понимаю, IHTMLDocument является "накопительным" для всех остальных от 2 до 5, и объявлять нужно именно им

Накопительный чего?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.02.2006 (Вт) 22:40

Накопительный интерфейс.
Но это не так. По законам COM однажды объявленные интерфейсы никогда не пересматриваются и не дополняются.
Изображение

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 15.02.2006 (Ср) 10:53

А не проще(если FW2) грузануть в WebBrowser и смотреть HTMLDOCUMENT?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.02.2006 (Ср) 11:11

Sebas
Vinechka писал(а):Засовывать HTML в WebBrowser не получится, так как имеющийся там JScript вызывает ошибки и появляются окна, которые вообще нафиг не нужны.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.02.2006 (Ср) 13:50

GSerg писал(а):Sebas
Vinechka писал(а):Засовывать HTML в WebBrowser не получится, так как имеющийся там JScript вызывает ошибки и появляются окна, которые вообще нафиг не нужны.

WebBrowser.Silent = True :?:
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.02.2006 (Ср) 14:20

tyomitch писал(а):Накопительный интерфейс.
Но это не так. По законам COM однажды объявленные интерфейсы никогда не пересматриваются и не дополняются.
С законом не поспоришь, но как же в таком случае в IHTMLDocument, IHTMLElement и т.п. от версии к версии появляются новые свойства и методы? Тем более, что объектная структура mshtml это не dll, а tlb. Разве нельзя создать интерфейс новой версии, унаследовать его в IHTMLDocument и скомпилировать в новый tlb со старыми progid? Старые приложения по идее могут продолжать его использовать, потому что нужные им интерфейсы уже давно унаследованы, а новые их не волнуют.
Последний раз редактировалось Antonariy 15.02.2006 (Ср) 14:45, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.02.2006 (Ср) 14:33

И IID'ы остаются те же? Или как в Office?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.02.2006 (Ср) 14:57

GSerg, up :wink:

PS. Проверил на двух машинах w2k pro, на одной ie5 на другой ie6. TypeLib mshtml один и тот же - {3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}, смею предположить, что и clsid интерфейсов остались те же, однако в ie6 интерфейсов прибавилось. Например добавился интерфейс IHTMLEventObj4 с единственным свойством - wheelDelta. Уверен, что в ie5 alert(event.wheelDelta) не сработает 8)
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.02.2006 (Ср) 15:26

Не, библиотеку в сад... интерфейсные сравни...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.02.2006 (Ср) 15:35

Antonariy писал(а):смею предположить, что и clsid интерфейсов остались те же

CLSID у интерфейсов в принципе не бывает. Они есть только у классов.


Что касается законов COM, то в твоём представлении проги, скомпилированные с новыми версиями TLB, должны неотвратимо падать со старой версией DLL? По твоей логике должно быть именно так :-?
(см. тж. http://blogs.msdn.com/oldnewthing/archi ... 87658.aspx )
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.02.2006 (Ср) 15:58

CLSID у интерфейсов в принципе не бывает. Они есть только у классов.
HKEY_CLASSES_ROOT\Interface\{3050F1FF-98B5-11CF-BB82-00AA00BDCE0B}\(По умолчанию)=IHTMLElement
Ну не clsid, а Interface, не важно. Проверил, одинаково для обоих версий.
Что касается законов COM, то в твоём представлении проги, скомпилированные с новыми версиями TLB, должны неотвратимо падать со старой версией DLL?
Нет, пока не попытаются вызвать метод, который не реализован в старой версии.

Рискну повторить вопрос. Как же в таком случае в IHTMLDocument, IHTMLElement и т.п. от версии к версии появляются новые свойства и методы?
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.02.2006 (Ср) 16:03

Antonariy писал(а):
CLSID у интерфейсов в принципе не бывает. Они есть только у классов.
HKEY_CLASSES_ROOT\Interface\{3050F1FF-98B5-11CF-BB82-00AA00BDCE0B}\(По умолчанию)=IHTMLElement
Ну не clsid, а Interface, не важно.

"Кошка, собака -- какая разница? и там и там четыре лапы и хвост." (с)

Ты действительно не понимаешь разницы между классами и интерфейсами?

Antonariy писал(а):Рискну повторить вопрос. Как же в таком случае в IHTMLDocument, IHTMLElement и т.п. от версии к версии появляются новые свойства и методы?

А с чего ты, вообще говоря, взял, что они там появляются? ;-)
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.02.2006 (Ср) 16:31

Ты действительно не понимаешь разницы между классами и интерфейсами?
Е-мое, речь не о разнице между классами и интерфейсами, а о том, что идентификатор интерфейса не изменяется.
А с чего ты, вообще говоря, взял, что они там появляются?
Ладно, если ты такой любитель придираться к словам, перефразирую.

Как же в таком случае объект, объявленный как IHTMLDocument, IHTMLElement и т.п., от версии к версии получает в свое распоряжение новые свойства и методы?

Спрашиваю, потому что хочу узнать, а не просто повозить мюслями по тарелке. Раньше было интересно, но как-то отстраненно, типа есть ли жизнь на Альфе Центавра, а тут поднялась эта тема, вот и хочу разобраться. Твою ссылку попытался прочитать, но без словаря не догоняю.
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.02.2006 (Ср) 17:16

Antonariy писал(а):Как же в таком случае объект, объявленный как IHTMLDocument, IHTMLElement и т.п., от версии к версии получает в свое распоряжение новые свойства и методы?

Какой конкретно объект, объявленный с одним и тем же интерфейсом, от версии к версии получает в свое распоряжение новые свойства и методы?
(лучше всего приложи свою TLB, а то у меня старых IE под рукой нету)
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.02.2006 (Ср) 17:53

Любой из тех, у которых есть "надстройки" с номером. Например, тот же IHTMLDocument.
Вложения
mshtml.rar
mshtml.tlb 5й версии
(81.1 Кб) Скачиваний: 68
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.02.2006 (Ср) 18:24

В этой библиотеке:
Код: Выделить всё
    [
      odl,
      uuid(626FC520-A41E-11CF-A731-00A0C9082637),
      dual,
      oleautomation
    ]
    interface IHTMLDocument : IDispatch {
        [id(0x000003e9), propget, hidden]
        HRESULT Script([out, retval] IDispatch** p);
    };


В моей библиотеке:
Код: Выделить всё
    [
      odl,
      uuid(626FC520-A41E-11CF-A731-00A0C9082637),
      dual,
      oleautomation
    ]
    interface IHTMLDocument : IDispatch {
        [id(0x000003e9), propget, hidden]
        HRESULT Script([out, retval] IDispatch** p);
    };


Найди 10 отличий.
Вложения
mshtml.rar
два IDL-файла
(60.15 Кб) Скачиваний: 97
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 16.02.2006 (Чт) 11:20

Для справки: вопрос "Как?.." подразумевает ответ "Вот так:..", а не "найди 10 отличий там где их нет".
Некоторым нужно объяснять "на пальцах" действия, тебе же нужно так задавать вопросы, чтобы не давать возможности ответить вопросом на вопрос или ответить вообще не понятно на что.
Вот есть такой код:

Dim doc as IHTMLDocument
Set doc = New HTMLDocument
MsgBox doc.bgColor
MsgBox doc.compatMode

Допустим я его скомпилировал и запустил на машине с ie6 - вылезли два сообщения - #ffffff и BackCompat. А потом запустил на машине с ie5 - #ffffff и ошибка object does not support this property or method.

Откуда у doc появляется свойство compatMode в ie6, если интерфейс не меняется? Кстати, IHTMLDocument вообще не содержит свойств и методов, а если объявить doc как HTMLDocument ситуация та же. Как такая кухня работает?
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.02.2006 (Чт) 12:19

Значит, ты всё-таки не понимаешь разницу между классом и интерфейсом :-(

У класса HTMLDocument в IE6 добавилась поддержка IHTMLDocument5. Поэтому ты можешь обращаться к свойству compatMode.

Вызов на самом деле проходит не через IHTMLDocument, а через DispHTMLDocument. Не веришь -- переобъяви doc As IHTMLDocument3 и убедись. Или по-твоему, все интерфейсы IHTMLDocumentX накопительные?

Вот и всё. А интерфейсы IHTMLDocument, IHTMLDocument2, IHTMLDocument3 не изменились ни на бит.
Изображение

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList