在VBA中解析HTML以从描述列表中提取信息?
我想用在VBA中解析HTML以从描述列表中提取信息?,html,excel,vba,Html,Excel,Vba,我想用excelxp从网站中提取信息 我找到了一些示例代码(),并尝试了以下操作: Function strHtmlElementValue(htmldoc As HTMLDocument, id As String) As String Dim HtmlElement As IHTMLElement Set HtmlElement = htmldoc.getElementById(id) strHtmlElementValue = id & ": " & HtmlElement
excelxp
从网站中提取信息
我找到了一些示例代码(),并尝试了以下操作:
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
):
如果我使用字符串“expose title”作为id,函数将返回页面的标题,这很好
但是我怎样才能访问e。G价格之类的信息
在Html代码中,它看起来是这样的。没有ID,如果我尝试将类名“is24qa-kaufpreis”用于getelementbyid
,我会收到一条错误消息
<dl>
<dt>
<strong class="is24qa-kaufpreis-label">
Kaufpreis:
</strong>
</dt>
<dd class="is24qa-kaufpreis">
2.190.000,00 EUR
</dd>
</dl>
考夫普里斯:
2.190.000,00欧元
那么,有没有一种方法可以直接访问像“is24qa-kaufpreis”这样的字段并读取内部文本(在本例中为2.190.000,00欧元?有许多不同的方法可以实现。下面的代码显示了基于“getElementsByTagName”的两种方法在web页面的源代码中,如果您可以计算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
使用
考夫普里斯
使用
2.190.000,00欧元
(0)是相同标记元素的编号,代码中可以有许多具有相同标记名称的条目,要检索它们,请使用(“标记”)(0),(“标记”)(1),…,(“标记”)(n)
我建议研究有关子元素或子元素的主题,以实现自动化。这对我来说是可行的。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
子测试GEBCN()
Dim doc作为新的MSHTML.HTMLDocument、html、els
html=“kaufpreis:&_
“”和_
“2.190.000,00欧元”
doc.body.innerHTML=html
设置els=doc.getElementsByClassName(“is24qa kaufpreis”)
调试。打印els(0)。innerText
端接头
还请记住,Excel可以自己进行web查询。在“数据-导入外部数据-新建web查询”菜单(Alt+D、D、W)上,您可以将其称为sheet2!a22或其他任何名称。对于不断更改布局的页面来说,这没有好处。
HTMLDocument方法应用CSS选择器dd[class='is24qa-kaufpreis']
这表示获取标记名为dd
的第一个元素,该元素具有is24qa-kaufpreis'
“[]”的class
属性
CSS查询:
htmldocument.querySelector("dd[class='is24qa-kaufpreis']").innerText
VBA:
htmldocument.querySelector("dd[class='is24qa-kaufpreis']").innerText
您需要获取HTMLDocument对象,但其他答案已经显示了该对象的名称。您需要的是GetElementsByCassName
-注意,这将返回一个匹配元素的集合,因此您可以执行以下操作:Dim els:Set els=htmldoc.GetElementsByCassName(“is24qa kaufpreis”)
然后els(0)
将包含您文档中的第一个匹配项。注意:getElementsByClassName
首次出现在IE9中,因此不确定您的系统上是否可以使用。@TimWilliams我尝试的第一件事是getElementsByClassName(“is24qa kaufpreis”)的几个变体,但无法让它们工作(我正在运行IE11)。如果您尝试过,请告诉我它是否适合您。我先尝试过,但当时不确定如何获取所需信息。我假设不是所有这些页面上的价格(例如)都会出现在同一个单元格中,并且没有表可供选择,因此我必须获取整个页面。但肯定的是,这也是一个有趣的选项。
htmldocument.querySelector("dd[class='is24qa-kaufpreis']").innerText