在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
的第一个元素,该元素具有i
s24qa-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