Excel 通过更改类名进行刮取

Excel 通过更改类名进行刮取,excel,vba,web-scraping,Excel,Vba,Web Scraping,我试图从网页中提取姓名、地址、角色、状态、任命日期、辞职日期(如果有的话),下面是一个代码示例 问题是每家公司的董事人数可能不同,我不确定如何确定总董事人数-1=x,以便我可以循环查看 HTLM代码: 通讯地址 圣詹姆斯一世&39岁;伦敦s广场,SW1Y 4PD 角色 忙碌的 秘书 任命日期 2020年6月1日 通讯地址 圣詹姆斯一世&39岁;伦敦s广场,SW1Y 4PD 角色 忙碌的 秘书 任命日期 2019年5月7日 VBA代码:我试图使用querySelectorall,但无法“识别”正确

我试图从网页中提取姓名、地址、角色、状态、任命日期、辞职日期(如果有的话),下面是一个代码示例

问题是每家公司的董事人数可能不同,我不确定如何确定总董事人数-1=x,以便我可以循环查看

HTLM代码:

通讯地址 圣詹姆斯一世&39岁;伦敦s广场,SW1Y 4PD 角色 忙碌的 秘书 任命日期 2020年6月1日 通讯地址 圣詹姆斯一世&39岁;伦敦s广场,SW1Y 4PD 角色 忙碌的 秘书 任命日期 2019年5月7日 VBA代码:我试图使用querySelectorall,但无法“识别”正确的类id

子变更表 设置ie=CreateObjectInternetExplorer.Application 可见=真实 导航https://find-and-update.company-information.service.gov.uk/company/00102498/officers Do While ie.readyState 4:DoEvents:Loop 'Application.Wait Now+时间值0:00:02 '将i设置为长,将secNumberNodeList设置为对象,将secNumberNode设置为对象 Set-secNumberNodeList=ie.Document.QuerySelectorAllAppoints-list 对于secNumberNodeList中的每个sc Debug.Print sc.getElementByIdofficer-name-1 Debug.Print sc.getElementByIdofficer-address-value-1 Debug.Print sc.getElementByIdofficer-status-tag-1 Debug.Print sc.getElementByIdofficer-committed-on-1 Debug.Print sc.getElementByIdofficer-committed-on-1 Debug.Print sc.getElementByIdofficer-on-16 下一个 端接头
这是一个强大的方法,你可以这样做。我使用了XMLHttpRequest而不是IE。我试图展示如何使用循环来访问所有容器的内容。尝试在循环中定义您感兴趣的其他字段来解析它们

Option Explicit
Sub GetInformation()
    Const URL = "https://find-and-update.company-information.service.gov.uk/company/00102498/officers"
    Dim Http As Object, Html As HTMLDocument, I&
    Dim HtmlDoc As HTMLDocument, sName$, sAddress$

    Set Html = New HTMLDocument
    Set HtmlDoc = New HTMLDocument
    Set Http = CreateObject("MSXML2.XMLHTTP")

    With Http
        .Open "GET", URL, False
        .send
        Html.body.innerHTML = .responseText
    End With

    With Html.querySelectorAll(".appointments-list > [class^='appointment-']")
        For I = 0 To .Length - 1
            HtmlDoc.body.innerHTML = .Item(I).outerHTML
            sName = HtmlDoc.querySelector("h2 > span > a").innerText
            sAddress = HtmlDoc.querySelector(".data[id^='officer-address-value-']").innerText
            Debug.Print sName, sAddress
        Next I
    End With
End Sub
执行上述脚本需要添加的引用:

1. Microsoft XML, v6.0
2. Microsoft HTML Object Library

这是一个强大的方法,你可以这样做。我使用了XMLHttpRequest而不是IE。我试图展示如何使用循环来访问所有容器的内容。尝试在循环中定义您感兴趣的其他字段来解析它们

Option Explicit
Sub GetInformation()
    Const URL = "https://find-and-update.company-information.service.gov.uk/company/00102498/officers"
    Dim Http As Object, Html As HTMLDocument, I&
    Dim HtmlDoc As HTMLDocument, sName$, sAddress$

    Set Html = New HTMLDocument
    Set HtmlDoc = New HTMLDocument
    Set Http = CreateObject("MSXML2.XMLHTTP")

    With Http
        .Open "GET", URL, False
        .send
        Html.body.innerHTML = .responseText
    End With

    With Html.querySelectorAll(".appointments-list > [class^='appointment-']")
        For I = 0 To .Length - 1
            HtmlDoc.body.innerHTML = .Item(I).outerHTML
            sName = HtmlDoc.querySelector("h2 > span > a").innerText
            sAddress = HtmlDoc.querySelector(".data[id^='officer-address-value-']").innerText
            Debug.Print sName, sAddress
        Next I
    End With
End Sub
执行上述脚本需要添加的引用:

1. Microsoft XML, v6.0
2. Microsoft HTML Object Library

不知道为什么我写我的答案时你的答案没有显示出来。我猜你是在我写作的时候发的!抱歉。你从不同的角度回答了这个问题,以解决同一个问题@QHarr。我真的找不到你删除它的任何理由。谢谢。@Sim,非常感谢。我在'sStatus=HtmlDoc.querySelector.data[id^='officer-status-tag-']上收到一个错误。innerText。我做错了什么?请改为尝试sStatus=HtmlDoc.querySelectorspan[id^='officer-status-tag-']。InnerText不确定我写我的答案时为什么没有显示你的答案。我猜你是在我写作的时候发的!抱歉。你从不同的角度回答了这个问题,以解决同一个问题@QHarr。我真的找不到你删除它的任何理由。谢谢。@Sim,非常感谢。我在'sStatus=HtmlDoc.querySelector.data[id^='officer-status-tag-']上收到一个错误。innerText。我做错了什么?请改为尝试sStatus=HtmlDoc.querySelectorspan[id^='officer-status-tag-'].innerText