| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Как можно получить текст с web-страницы ? |
| Автор: svch 11.3.2008, 08:59 |
| Добрый день ! Задача у меня вот какая: надо с страницы выдернуть текст. Подошел бы HTML, но дело в том, что часть контента формируется с помощью JS, и соотв-но в HTML-коде этого контента нет. ResponseText из Msxml2.XMLHTTP возвращает почему-то HTML. Получилось взять текст только с помощью InternetExplorer.Application, но он как-то уж очень медленно работает. Если у кого есть идеи - буду очень признателен. С уважением, Сергей. |
| Автор: Akina 11.3.2008, 09:22 |
| MSInet Control получает текст непосредственно от сервера. Ему JS и исполнять-то нечем... |
| Автор: svch 11.3.2008, 11:40 |
| Ну сервер-то отдаст что надо. А вот как получить текст, исполняемый в браузере ? Я так понимаю, что только создав что-то типа InternetExplorer.Application. Честно говоря думал всегда, что ResponseText возвращает текст, а ResponseHTML соотв-но код страницы. |
| Автор: Akina 11.3.2008, 11:46 |
Ну русским же языком сказал - на форму MS Inet Control, Inet1.Execute URL, "GET" и выгребай свой яваскрипт |
| Автор: svch 11.3.2008, 12:23 | ||
sText содержит HTML код. А как можно текст страницы получить ? Я все таки, наверное, не до конца понимаю. |
| Автор: Akina 11.3.2008, 13:54 |
| См. аттач |
| Автор: svch 11.3.2008, 15:01 |
| Говорит, что не хватает аргументов Inet1.Execute(URL, "GET") |
| Автор: Akina 11.3.2008, 15:17 |
| Значит, у тебя референс на Microsoft Internet Transfer Control 6.0 улетел - восстанови. Проект - Компоненты. |
| Автор: svch 11.3.2008, 16:00 |
| Вот тут написано, что у метода Execute (для HTTP) должно быть 4 аргумента http://read.excode.ru/art696p1.html |
| Автор: Akina 11.3.2008, 16:27 |
| Версию system32\msinet.ocx озвучьте плиз |
| Автор: svch 11.3.2008, 16:46 | ||
![]() Я, скорее всего что-то не так делаю, потому как в Access работает и такой код:
т.е. с единственным аргументом. И Inet1.GetChunk(1024, icString) все равно возвращает (в Access) HTML-код. |
| Автор: svch 11.3.2008, 17:14 | ||
В общем вот такая вот ситуация: работает только с таким кодом
Но все равно возвращает не текст с страницы, а ее HTML-код. Ай нид хелп. Буду очень признателен. С уважением, Сергей. |
| Автор: Akina 11.3.2008, 17:51 |
| Вот что получаю я... Версия msinet.ocx - 6.00.8862, wininet.dll - 6.00.3790.4186 (srv03_sp2_qfe.071108-1306) |
| Автор: svch 11.3.2008, 18:10 |
| Я тему специально назвал: Как можно получить текст с web-страницы ? Не HTML-контент, а именно текст. Тот пример, что Вы здесь привели возвращает именно HTML-код, среди которого, конечно, есть ЧАСТЬ текста страницы. Примером может служить всем известный Яндекс-директ, который на странице в браузере виден, а в HTML-коде его нет, только ява-скрипт. |
| Автор: Akina 11.3.2008, 19:07 |
| Упс... вижу одно, думаю другое... сорри, бывает. Тады чуть позже. |
| Автор: Naghual 11.3.2008, 19:17 | ||
|
| Автор: svch 12.3.2008, 13:03 | ||
| Извините, а можно ли полный код представить ? Ну что-то вроде:
Огромное Вам спасибо. С уважением, Сергей. |
| Автор: Naghual 12.3.2008, 13:13 |
| Так полнее некуда! ;) Кладешь на форму WebBrowser(WebBrowser1) и пользуешься кодом. Добавлено через 10 минут и 6 секунд Простите, понял свою ошибку - исправляю: Подключаешь к проекту компонент "Microsoft Internet Controls" (ieframe.dll). Кладешь на форму новый экземпляр объекта WebBrowser с именем WebBrowser1. Используешь код. |
| Автор: svch 12.3.2008, 14:08 |
Вот, что у меня кажет :(![]() |
| Автор: Naghual 12.3.2008, 14:18 |
| У вас на форме нет созданного экземпляра компонента. В этом проблема. |
| Автор: svch 12.3.2008, 14:27 |
Ну как же нет, если даже навигация прошла и этот компонент получил html-код сайта ?![]() |
| Автор: Naghual 12.3.2008, 14:30 |
| Странно. У меня на VB6 работает. Попробуйте подключить рефференс того, чему у вас соответствует Body. |
| Автор: svch 12.3.2008, 15:30 |
| А вы не могли бы выложить сюда нужные файлы (для регистрации и пример кода) ? У меня просто VS 2005, я только начинающий ... и "подключить рефференс того, чему у вас соответствует Body" - не знаю, что это значит. Спасибо. С уважением, Сергей. |
| Автор: Naghual 12.3.2008, 15:53 |
| Пожалуйста. Вот проект. |
| Автор: Akina 12.3.2008, 16:29 |
Ну не до такой же степени, чтобы ошибаться разделом... Тема перенесена |
| Автор: Akina 12.3.2008, 16:30 |
| Перемещено в VB .NET. |
| Автор: svch 12.3.2008, 20:26 |
| В общем что-то начало вырисовываться ... В браузере открывается страница, текст получить могу. Но есть одно "но". Страниц этих у меня довольно много, и я сделал цикл по таблице с урлами. При переходе на следующую запись в таблице я гружу текущий урл в браузер и вот тут получается затык. Дело в том, что надо как-то дождаться, пока страница полностью загрузится и уже после получать с нее текст. Пытался как-то обрабатывать WebBrowser_DocumentComplete и WebBrowser.Busy, но как-то безуспешно. Помогите добить до конца уж ... С уважением, Сергей. З.Ы. Может все таки тему обратно в VB6 перенести ? Я таки его себе установил. |
| Автор: Exception 13.3.2008, 16:19 |
| Ну вы даёте Перемещаю обратно. |
| Автор: svch 13.3.2008, 17:14 | ||||
А как его там вызывать-то ? Если использовать что-то похожее на это.
С уважением, Сергей. |
| Автор: Naghual 13.3.2008, 17:25 | ||
Ну хотя бы так:
|
| Автор: svch 13.3.2008, 18:34 | ||
А по какой причине
может возвращать пустое значение ? Хотя страница в браузер грузится. |
| Автор: Naghual 13.3.2008, 18:36 |
| Ну например, если страница из фреймов. |
| Автор: svch 14.3.2008, 12:32 | ||||
Нет, фреймов нет. Что-то все равно я не так делаю :(
Выдается пустой MsgBox, хотя если открыть этот урл по-простому
то все отображается нормально. Бьюсь, как рыба об лед. Решение где-то совсем уже рядом. С уважением, Сергей. |
| Автор: AlexChuntonov 14.3.2008, 15:27 |
| Народ! Похожая проблема... Необходимо отслеживать изменеие некое инфы на странице. Структура документа сильно фреймованная. До нужного фрейма посредством DOM добрался. Свойство innerHTML и innerText не возвращает то, что нужно, ибо контент динамический... Скрипт генерит контент весьма кудряво. Да и сам скрипт, генерящий контент, генерится многоступенчато другим скриптом из другого фрейма. Ну вот такой вот веб-программер извращенец... НУЖНО: нужно то, что показывается по меню правой кнопки, пункт "Исходный текст" Можно конечно и хэндл окна получить, и мессиджи послать, и отловить хэндл окна просмотра исходного кода, и опять мессиджи послать, и текст выгрести... Но я не верю, что через DOM или объектную модель эту инфу извлечь невозможно! Я просто не понимаю... Да и DOM в объекте WebBrowser урезанный какой-то! WebBrowser.Document.all.frames(i).name возвращает, а... WebBrowser.Document.all.frames(i).innerHtml - кричит, что неподдерживаемое свойство! Чоза? |
| Автор: Naghual 14.3.2008, 15:29 | ||
| Так у Вас, батенька, нет понимания алгоритма того что Вы же сами и делаете. Читайте основы. Вот как примерно должно быть:
AlexChuntonov, пожалуйста, создайте отдельную тему. |
| Автор: svch 14.3.2008, 17:02 | ||
| Да, спасибо большое за поправку. Но в данном виде код с моими урлами не работает. Такое ощущение, что
срабатывает раньше, чем страница полностью загружена. Я сделал отдельную кнопку с этим событием, загрузил в браузер один из своих урлов, дождался загрузки. Нажал на кнопку и получит нужный текст. Почитал, что есть события Busy и State. Busy не советуют, а вот как пользоваться State - я найти не могу. С уважением, Сергей. |
| Автор: Naghual 14.3.2008, 17:36 |
| В ошибках рождается истина! Проконтролруйте, не срабатывает ли событие DocumentComplete несколько раз для одного УРЛа. Если да - продебагте все состояния State и Busy для выяснения закономерности. Вариантов масса - пробуйте. |
| Автор: svch 14.3.2008, 18:16 | ||||
Думаю, что нет. Сообщение выдается один раз на один урл. Просто контент страницы, как я говорил, сожержит яву-скрипт, который в свою очередь грузит доп.контент (с другого сайта). Поэтому, может, скачав вель локальный контент и происходит событие WebBrowser1_DocumentComplete ? А вот как дождаться, пока вся страница будет загружена ? Ставил следующий код в WebBrowser1_DocumentComplete:
Ходит по этому циклу непереставая С уважением, Сергей. |
| Автор: Naghual 14.3.2008, 18:20 |
| УРЛ в студию! |
| Автор: svch 14.3.2008, 18:34 |
| Урл в личку ушел. |
| Автор: Naghual 14.3.2008, 18:39 |
| Ок. Я посмотрел на него. Вопрос: Какой текст вы хотите получить с этой страницы, если там НЕТ текста! Все формируется динамической графикой. |
| Автор: Naghual 14.3.2008, 19:14 | ||
| Я думаю над вашим вопросом... Добавлено через 14 минут и 51 секунду Вот что придумалось на текущий момент:
Пробуйте, пишите. |
| Автор: svch 17.3.2008, 11:31 | ||
| В общем пляски с бубнами и помощь участников форума привела меня вот к чему: в Нете я нашел события, которые есть у компонента WebBrowser, прописал их в код и смотрел, какое событие за каким срабатывает. У меня получилось, что всегда на последнем месте WebBrowser1_CommandStateChange, на него я свой обработчик и поставил. Событие срабатывает несколько раз за навигацию, поэтому надо еще отловить WebBrowser1_DownloadComplete (возможно, это мой частный случай)
С уважением, Сергей. |
| Автор: svch 17.3.2008, 13:02 |
| Появился еще трабл :( При загрузке проги, переход по урлам нормальный и быстрый. Но после 5-10 урлов начинаются тормоза, которые только увеличиваются. Что нужно сделать с браузером, чтоб этого не происходило ? Память как-то очистить или еще что ? Большое спасибо. С уважением, Сергей. |
| Автор: svch 17.3.2008, 22:15 |
| Уважаемые гуру ? Не обделите вниманием Буду ОЧЕНЬ признателен. |
| Автор: svch 18.3.2008, 15:49 |
| Ну в общем пришлось сделать отдельных два exe-шника и из одного запускать другой. Иначе память съедается. |
| Автор: Kaktusjara 11.8.2009, 10:20 |
| старая тема, сори что поднимаю, но ради этого только зарегался. насчет пустого msgbox, вместо содержимого страницы: Короче мой способ прост до безобразия. В самом начале, например при форм.лоад открываем в браузере about:blank, после чего уже вызываем нужную нам страницу. Когда вы только вызвали страницу сразу запрашивать код или содержимое бесполезно - страница не успевает загрузиться. Но раз мы загрузили бланк (чистая страница), то после вызова интересующей нас странички перед выводом msgbox'а проверить, чтобы WebBrowser1.Document.body.innerText <> "", и проверку зациклить, пока не получим содержимое страницы. Надеюсь кому-то это поможет. |
| Автор: DrBoom 11.8.2009, 10:47 | ||
Страшный уж способ, ИМХО. DocumentComplete-событие чем не угодило? |
| Автор: fduck 14.8.2009, 13:19 |
| Читал тему,тк у меня подобный вопрос. Сделал как описывалось выше! Получилось только вывести ВЕСЬ текст в text,а как вывести отдельный текст в text? Например,IP,на 2ip.ru. Как быть? |
| Автор: DrBoom 16.8.2009, 19:03 | ||||||||||||||
Для этого нужно понимать, что вы хотите загружать и где это находится. А для этого Вам нужно понять объектную модель DOM в HTMLе. Привожу несколько примеров, а нужный выбирайте сами. 1. Если известно ID текстового поля:
То получаем значения из него так:
2. Если известно Name текстового поля:
То получаем значения из него так:
3. Если известно Name текстового поля и ID формы:
То получаем значения из него так:
ЗЫ. Если неизвестен ID формы, то можно получить её из коллекции forms для объекта document. 4. Текстовое поле можно тж. найти в коллекции all для объекта document. 5. Другими элементами также можно манипулировать, например, с помощью свойств innerHTML, innerTEXT, outerHTML. Чтобы было понятнее, попробуйте загрузить какую-нибудь страницу и запустить код, а после поэкспериментировать с ним:
|