Вопрос:
Я хочу извлечь информацию с веб-сайта с помощью Excel XP.
Я нашел пример кода ) и попробовал следующее:
Function strHtmlElementValue(htmldoc As HTMLDocument, id As String) As String Dim HtmlElement As IHTMLElement Set HtmlElement = htmldoc.getElementById(id) strHtmlElementValue = id & «: » & HtmlElement.innerText End Function
Я попробовал его со следующим URL (загружаемым как htmldoc): http://www.immobilienscout24.de/expose/73940554
Если я использую строку “expose-title” для id, функция возвращает заголовок страницы, что хорошо.
Но как я могу получить доступ к такой информации, как цена?
В коде Html это выглядит так. Нет идентификатора, и если я попытаюсь использовать имя класса “is24qa-kaufpreis” для getelementbyid, я получаю сообщение об ошибке.
<dl> <dt> <strong class=»is24qa-kaufpreis-label»> Kaufpreis: </strong> </dt> <dd class=»is24qa-kaufpreis»> 2.190.000,00 EUR </dd> </dl>
Итак, есть ли способ получить доступ к таким полям как “is24qa-kaufpreis” напрямую и зачитать внутренний текст (в данном случае 2.190.000,00 EUR?
Лучший ответ:
Есть несколько способов, которыми вы могли бы это сделать. Следующий код показывает два подхода, основанные на “getElementsByTagName”. В исходном коде для веб-страницы, если вы можете подсчитать, какой экземпляр div “dd” находится в kaufpreis, вы можете использовать первый метод. После него показан более общий подход.
Sub test() my_url = «http://www.immobilienscout24.de/expose/73940554» Set html_doc = CreateObject(«htmlfile») Set xml_obj = CreateObject(«MSXML2.XMLHTTP») xml_obj.Open «GET», my_url, False xml_obj.send html_doc.body.innerhtml = xml_obj.responseText Set xml_obj = Nothing k_pice = html_doc.body.getElementsByTagName(«dd»)(0).innertext ‘ Or Set Results = html_doc.body.getElementsByTagName(«dd») For Each itm In Results If InStr(1, itm.outerhtml, «EUR», vbTextCompare) > 0 Then k_price = itm.innertext Exit For Else End If Next End Sub Ответ №1
Это сработало для меня. IE11, но должен работать с IE9+.
Sub TestGEBCN() Dim doc As New MSHTML.HTMLDocument, html, els html = «<dl><dt><strong class=»»is24qa-kaufpreis-label»»>Kaufpreis:» & _ «</strong></dt><dd class=»»is24qa-kaufpreis»»>» & _ «2.190.000,00 EUR</dd></dl>» doc.body.innerHTML = html Set els = doc.getElementsByClassName(«is24qa-kaufpreis») Debug.Print els(0).innerText End Sub Ответ №2
использование
getElementsByTagName(«strong»)(0).InnerText
для Кауфрейса;
использование
getElementsByTagName(«dd»)(0).InnerText
за 2.190.000,00 EUR.
(0) – это номер одного и того же элемента тега, в коде может быть много записей с тем же именем тега, чтобы их использовать (“tag”) (0), (“tag”) (1),…, ( “тэг”) (п).
Я предлагаю исследовать темы, касающиеся дочерних элементов или вспомогательных элементов для целей автоматизации.
Ответ №3
Также помните, что Excel может выполнять собственные веб-запросы. В меню “Данные – импорт внешних данных” – новое меню веб-запросов (Alt + D, D, W). Тогда вы будете ссылаться на него как на лист2! A22 или что угодно. Это не хорошо для страницы, которая постоянно меняет ее макет.
Ответ №4
.querySelector метод HTMLDocument для применения CSS-селектора dd[class=’is24qa-kaufpreis’]
Это говорит о первом элементе с именем тега dd имеющим атрибут class я s24qa-kaufpreis’. «[]» означает атрибут.
Запрос CSS:
VBA:
htmldocument.querySelector(«dd[class=’is24qa-kaufpreis’]»).innerText
Вам нужно получить объект HTMLDocument, но другие ответы уже показывают, что для этого есть мезоны.