【问题标题】:Using XMLHTTP object to parse some websites in VBA在 VBA 中使用 XMLHTTP 对象解析一些网站
【发布时间】:2019-06-10 05:12:12
【问题描述】:

我正在尝试从 Wikipedia 页面中选取“关键人物”字段:https://en.wikipedia.org/wiki/Abbott_Laboratories 并将该值复制到我的 Excel 电子表格中。

我设法使用 xml http 来做到这一点,这是我喜欢它的速度的一种方法,你可以看到下面的代码正在运行。

但是代码不够灵活,因为 wiki 页面的结构可能会发生变化,例如它在此页面上不起作用:https://en.wikipedia.org/wiki/3M

由于tr td结构不完全相同(关键人物不再是3M页面的第8个TR)

如何改进我的代码?

Public Sub parsehtml()

Dim http As Object, html As New HTMLDocument, topics As Object, titleElem As Object, detailsElem As Object, topic As HTMLHtmlElement
Dim i As Integer

Set http = CreateObject("MSXML2.XMLHTTP")



http.Open "GET", "https://en.wikipedia.org/wiki/Abbott_Laboratories", False

http.send

html.body.innerHTML = http.responseText

Set topic = html.getElementsByTagName("tr")(8)

Set titleElem = topic.getElementsByTagName("td")(0)

ThisWorkbook.Sheets(1).Cells(1, 1).Value = titleElem.innerText

End Sub

【问题讨论】:

    标签: html excel vba web-scraping


    【解决方案1】:

    如果表格的行不是为“关键人物”固定的,那么为什么不为“关键人物”循环表格

    我测试了以下修改,发现它工作正常。

    在声明部分

    Dim topics As HTMLTable, Rw As HTMLTableRow
    

    然后是最后

    html.body.innerHTML = http.responseText
    Set topic = html.getElementsByClassName("infobox vcard")(0)
    
        For Each Rw In topic.Rows
            If Rw.Cells(0).innerText = "Key people" Then
            ThisWorkbook.Sheets(1).Cells(1, 1).Value = Rw.Cells(1).innerText
            Exit For
            End If
        Next
    

    【讨论】:

    • 这行得通,非常感谢!!!要回答您的问题,我根本没有我们可以测试“innerText”,对此非常新。再次感谢艾哈迈德
    • @will199 如果它回答了您的问题,请将其标记为答案。
    【解决方案2】:

    有更好更快的方法。至少对于给定的网址。匹配元素的类名和索引到返回的节点列表。需要处理的返回项更少,元素的路径更短,匹配类名比匹配元素类型更快。

    Option Explicit
    Public Sub GetKeyPeople()
        Dim html As HTMLDocument, body As String, urls(), i As Long, keyPeople
        Set html = New HTMLDocument
        urls = Array("https://en.wikipedia.org/wiki/Abbott_Laboratories", "https://en.wikipedia.org/wiki/3M")
        With CreateObject("MSXML2.XMLHTTP")
            For i = LBound(urls) To UBound(urls)
                .Open "GET", urls(i), False
                .send
                html.body.innerHTML = .responseText
                keyPeople = html.querySelectorAll(".agent").item(1).innerText
                ThisWorkbook.Worksheets("Sheet1").Cells(i + 1, 1).Value = keyPeople
            Next
        End With
    End Sub
    

    【讨论】:

    • +1,这确实是最好的直接方式。感谢您的启迪,我应该对所有选择持开放态度,而不是让我的思想被旧的传统粗略方式所困扰..
    • @AhmedAU 在没有更多测试用例的情况下,我想说随着时间的推移,您的测试用例可能会变得更加健壮,+,因此我需要警告。
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2014-04-03
    • 2013-09-14
    • 2023-03-07
    • 2012-02-06
    相关资源
    最近更新 更多