У меня есть следующий код, который должен очищать таблицу и печатать результат. Я ожидаю получить их в таблице
Графство| Шропшир Адрес| Средняя школа Адамса, Хай-стрит, Ньюпорт TF10 7BD так далее
Но я получаю следующее:
ГрафствоШропшир АдресAdams Grammar School, High Street, Newport TF10 7BD TypeBoys Grammar Ученики799
Так что нет места внутри.
Что мне не хватает?
Sub scrapeschools()
Dim ie As New SHDocVw.InternetExplorer
Dim htmldoc As MSHTML.HTMLDocument
Dim htmltable As MSHTML.htmltable
Dim tablerow As MSHTML.IHTMLElement
Dim tablecell As MSHTML.IHTMLElement
Dim tablecol As MSHTML.IHTMLElement
ie.Visible = True
ie.navigate "https://www.11plusguide.com/grammar-school-test-areas/wolverhampton-shropshire-walsall/adams-grammar-school/"
Do While ie.readyState < READYSTATE_COMPLETE Or ie.Busy
Loop
Set htmldoc = ie.document
Set htmltable = htmldoc.getElementsByTagName("table")(0)
For Each tablerow In htmltable.Children
For Each tablecell In tablerow.Children
Debug.Print tablecell.innerText
Next tablecell
Next tablerow
End Sub
Ваши элементы в цикле не относятся к тому классу, который вы ожидаете (на основе вашего именования переменных). Это прошло без возникновения ошибки, поскольку вы объявили элементы, участвующие в цикле, в общем виде как MSHTML.IHTMLElement.
Шагом отладки может быть изучение соответствующего HTML, чтобы понять, что производит htmltable.Children.
Вы также можете добавить паруDebug.Print TypeName(foo) вызовов в свой цикл, чтобы увидеть, с чем вы на самом деле работаете:
For Each tablerow In htmltable.Children
Debug.Print TypeName(tablerow)
For Each tablecell In tablerow.Children
Debug.Print TypeName(tablecell)
Next tablecell
Next tablerow
Сначала вы работаете с разделом, затем вы зацикливаете строки таблицы, а не ячейки таблицы, следовательно, ваш сжатый вывод. Это легко исправить:
.Rows
, чтобы убедиться, что вы зацикливаете строки таблицы.Dim tablerow As MSHTML.IHTMLTableRow
Dim tablecell As MSHTML.IHTMLTableCell
For Each tablerow In htmltable.Rows
For Each tablecell In tablerow.Children
Debug.Print tablecell.innerText
Next tablecell
Next tablerow
Лично я бы: