在VBA中解析HTML以从描述列表中提取信息?

时间:2014-04-25 21:41:52

标签: html excel vba

我想使用Excel XP从网站中提取信息。

我找到了一些示例代码(http://www.wiseowl.co.uk/blog/s393/scrape-website-html.htm)并尝试了以下内容:

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

我尝试使用以下网址(加载为htmldoc):http://www.immobilienscout24.de/expose/73940554

如果我使用字符串“expose-title”作为id,则该函数返回页面的标题,这很好。

但我怎样才能访问e。 G。信息如价格?

在Html代码中,它看起来像那样。没有ID,如果我尝试使用getelementbyid的类名“is24qa-kaufpreis”,我会收到一条错误消息。

   <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

5 个答案:

答案 0 :(得分:2)

有许多不同的方法可以解决这个问题。以下代码显示了基于“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 :(得分:2)

这对我有用。 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 :(得分:1)

使用

getElementsByTagName("strong")(0).InnerText 

表示Kaufpreis;

使用

getElementsByTagName("dd")(0).InnerText 

为2.190.000,00欧元。

(0)是相同标签元素的编号,代码中可以有许多具有相同标签名称的条目,以检索它们使用(“tag”)(0),(“tag”)(1) ,...,( “标签”)(N)。

我建议为自动化目的研究有关子元素或子元素的主题。

答案 3 :(得分:1)

还要记住Excel可以自己进行Web查询。在数据上 - 导入外部数据 - 新建Web查询菜单(Alt + D,D,W)。然后你会把它称为sheet2!a22或其他什么。对于不断改变其布局的页面来说没有好处。

答案 4 :(得分:1)

CSS selector:

HTMLDocument的

.querySelector方法,以应用dd[class='is24qa-kaufpreis']

的CSS选择器

这表示获取标签名称为dd且属性为i class的{​​{1}}的第一个元素。 s24qa-kaufpreis'表示属性。


CSS查询:

css query


VBA:

"[]"

您需要获取HTMLDocument对象,但其他答案对此已经显示出了解决方法。