Получить текст из фрейма HTML страницы в WebBrowser

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Получить текст из фрейма HTML страницы в WebBrowser

Сообщение Sun07 » 05.01.2007 (Пт) 3:11

Подскажите, пожалуйста, как получить текст из фрейма HTML страницы в WebBrowser в ситуации:
Код: Выделить всё
<TD id=myid style=...
<TABLE ...
<TBODY>
<TR>
<TD style=...
<IFRAME src="/.../.../" </IFRAME>
<DIV></DIV></TD></TR></TBODY></TABLE></TD>

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 9:50

Дать IFRAME-у name (или ID) и он станет доступным как WB.Document.<его имя>
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 05.01.2007 (Пт) 10:46

т.е. ты предлагаешь перезаписать подкорректированную страницу в WB. А через таблицу нельзя добраться к данным фрейма? Или фрейм это как отдельное государство?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 11:13

Нет я не придлагаю ничего перезаписывать.

А предлагаю сразу же загрузить нормальную страницу.

А вообще тебе через объект Document можно достучаться до всего (ну или почти до всего). В данном случае это коллекция document.frames
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 05.01.2007 (Пт) 21:36

напиши, пожалуйста, как обратиться к фрейму для innertext с id=myid?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 05.01.2007 (Пт) 21:49

Код: Выделить всё

Document.GetElementById("myid").innerText
Salus populi suprema lex

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 05.01.2007 (Пт) 22:35

Выдаёт Run-time error '91' - Object variable or Width block variable not set

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 22:36

Извини, но неужели надо быть настолько ...., чтобы догадаться что WebBrowser1.document.GetElementById("myid").innerText
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 05.01.2007 (Пт) 22:55

Хакер писал(а):Извини, но неужели надо быть настолько ...., чтобы догадаться что WebBrowser1.document.GetElementById("myid").innerText

Вот именно на этой строке и выдаёт ошибку. За имя контрола я не забыл.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 05.01.2007 (Пт) 22:56

а что у нас до этого? в коде? уж нег Docement.Write ли?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 06.01.2007 (Сб) 10:11

Если я делаю Navigate для html-файла фрейм отображается, но ошибка на innerText. Если по нижеприведённому коду - фрейм не отображается, хотя место под него выделяется, а ошибки нет:

Код: Выделить всё
sPage = "<HTML><BODY>" & vbCrLf & "место под фрейм выделено" & "<IFRAME id=myid src='/t/x/'></IFRAME>" & vbCrLf & "</BODY></HTML>" & vbCrLf

'загрузка простого документа
    WB.Navigate "res://mshtml.dll/blank.htm"
    While WB.Document Is Nothing    'ждём создания документа
        DoEvents
    Wend
    WB.Document.write sPage
    While WB.Document Is Nothing    'ждём создания документа
        DoEvents
    Wend
Debug.Print WB.Document.getElementById("myid").innerText

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.01.2007 (Сб) 11:06

Фтопку
Код: Выделить всё
While WB.Document Is Nothing    'ждём создания документа
        DoEvents
    Wend


GSerg где то выкладывал правильный способ.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 06.01.2007 (Сб) 11:13

а почему фрейм не отображается, если грузить страницу из памяти через Write?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 06.01.2007 (Сб) 11:33

Sun07 писал(а):а почему фрейм не отображается, если грузить страницу из памяти через Write?

Если правильно грузить, должен отображаться.
Хакер писал(а):
Код: Выделить всё
While WB.Document Is Nothing    'ждём создания документа
        DoEvents
Wend


Лучше так:
Код: Выделить всё

        While WebBrowser.ReadyState <> READYSTATE_COMPLETE
            DoEvents
        Wend
Salus populi suprema lex

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 06.01.2007 (Сб) 13:54

что значит - правильно грузить? Заменил на While WB.ReadyState <> READYSTATE_COMPLETE - исчезла ошибка на innerText при загрузке страницы из файла! Уже лучше!

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 06.01.2007 (Сб) 16:13

Проанализируй следующий код:
Код: Выделить всё
sPage = "<HTML><BODY>" & vbCrLf & "место под фрейм выделено" & "<IFRAME id=myid src='/t/x/'></IFRAME>" & vbCrLf & "</BODY></HTML>" & vbCrLf

'загрузка простого документа
    WB.Navigate "res://mshtml.dll/blank.htm"
    While WB.ReadyState <> READYSTATE_COMPLETE   'ждём создания документа
        DoEvents
    Wend
    WB.Document.write sPage
    'Второй цикл While фтопку
    'While WB.ReadyState <> READYSTATE_COMPLETE   'ждём создания документа
        'DoEvents
    'Wend
    'заменим innerText на innerHTML - что-нибудь изменилось?...
Debug.Print WB.Document.getElementById("myid").innerHTML
Salus populi suprema lex

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 06.01.2007 (Сб) 21:51

ничего не изменилось

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 07.01.2007 (Вс) 0:55

так почему же фрейм не отображается при загрузке страницы из памяти?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.01.2007 (Вс) 10:53

[здесь был текст, который теперь неважен]

Ну тогда фтопку Write...
Код: Выделить всё

sPage = "<HTML><BODY>" & vbCrLf & "Место под фрейм выделено" & "<IFRAME id=myid src='/t/x'></IFRAME>" & vbCrLf & "</BODY></HTML>" & vbCrLf

    WebBrowser.Navigate "res://mshtml.dll/blank.htm"
    While WebBrowser.ReadyState <> READYSTATE_COMPLETE
        DoEvents
    Wend
    WebBrowser.Document.body.innerHTML = sPage
Salus populi suprema lex

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 07.01.2007 (Вс) 12:36

о, dr.MIG, совсем другое дело, молодец! Так чего же нехватает методу Write, почему он не даёт нормального отображения? Ещё вопрос - как обращаться к фреймам по индексу (без ID или name)?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 07.01.2007 (Вс) 12:56

WebBrowser.Document.getElementsByTagName(«tagName»), где tagName – название тега. При этом получаем массив объектов. Чтобы обратиться к какому-то конкретному элементу этого массива, необходимо указать его индекс – WebBrowser.Document.getElementsByTagName(«tagName»).Item(Index).
Salus populi suprema lex

Sun07
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 355
Зарегистрирован: 17.02.2006 (Пт) 21:27

Сообщение Sun07 » 09.01.2007 (Вт) 2:00

не могу получить текст из фрейма, перебираю все фреймы, но все выдают пустую строку, хотя текст во фреймах отображается
Код: Выделить всё
For i = 0 To WB.Document.getElementsByTagName("IFRAME").length
Debug.Print WB.Document.getElementsByTagName("IFRAME").Item(i).innertext
Next

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 09.01.2007 (Вт) 2:02

А ведь frames это коллекция. А не поддерживает ли она For..Each? (я не проверял, я просто наталкиваю на мысль)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 09.01.2007 (Вт) 15:49

А что будет если вместо innerText попробовать innerHTML?
Salus populi suprema lex


Вернуться в Visual Basic 1–6

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

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

    TopList