【问题标题】:XMLHTTP with Hash character带有哈希字符的 XMLHTTP
【发布时间】:2026-01-07 00:30:01
【问题描述】:



我正在尝试使用 xmlhttp 和 VBA 抓取网站。

Url 有一个井号 (#) 符号,并被 VBA 误解...

这与此处解释的问题相同: Error in XMLHTTP Get request with Special character in URL
代码如下:

Sub webscraping()
Dim x               As String
Dim req             As MSXML2.XMLHTTP60
Dim doc             As HTMLDocument

x = "https://search.gleif.org/#/search/"

Set req = New MSXML2.XMLHTTP60
    With req
        .Open "GET", x, False
        .send
        If .Status <> 200 Then
            MsgBox "Http Request Error"
            Exit Sub
        End If
        Set doc = New MSHTML.HTMLDocument
        doc.body.innerHTML = .responseText
    End With
End Sub

提前谢谢你

【问题讨论】:

    标签: vba web-scraping xmlhttprequest


    【解决方案1】:

    您可以通过使用您的搜索词直接调用 API 来绕过此操作,如下所示。我正在使用 json parser 来处理 json 响应。在项目链接处添加 .bas 后,还可以转到 VBE > 工具 > 参考 > 添加对 Microsoft Scripting Runtime 的引用。

    请注意,您可以在此处更改 queryString 参数:"&amp;page%5Bnumber%5D=1&amp;page%5Bsize%5D=15"。这目前是 page=1,每页记录为 15。

    VBA:

    Option Explicit
    Public Sub webscraping()
        Dim url As String
        Dim req As MSXML2.XMLHTTP60
        Dim doc As HTMLDocument
        Dim json As Object
        Const TERM = "banana corp."
    
        url = "https://api.gleif.org/api/v1/lei-records?filter%5Bfulltext%5D=" & Application.EncodeURL(TERM) & "&page%5Bnumber%5D=1&page%5Bsize%5D=15"
    
        Set req = New MSXML2.XMLHTTP60
        With req
            .Open "GET", url, False
            .send
            If .Status <> 200 Then
                MsgBox "Http Request Error"
                Exit Sub
            End If
            Set json = JsonConverter.ParseJson(.responseText)
        End With
        Stop
        'Do something with json
    End Sub
    

    返回的信息很多,所以这里只是摘录:

    在这里研究 API:

    https://www.gleif.org/en/lei-data/gleif-lei-look-up-api/access-the-api

    【讨论】:

    • 你太棒了@QHarr!很抱歉打断这个线程,请问您如何从Set Json = JsonConverter.ParseJson(.responseText) 中提取信息。我做了一个For Each item In Json 并使用了Set Json = JsonConverter.ParseJson(.responseText)("data"),但无法获得例如:"legalName":{"name":"status":"ACTIVE"。知道我可以从哪里开始吗?我曾尝试关注您的一篇帖子至extract json field,但没有成功:
    • 嗨 - 我稍后会发布一个 pastebin - 今晚就追我吧
    • 嗨,你太好了:)!。我进步了一点。当我知道 LEI 代码 leilookup.gleif.org/api/v2/leirecords?lei=5299008TNNMXDKX6JB96 时,我使用以下站点来获取概述的结构:(json.parser.online.fr),然后我使用 Debug.Print item("Entity")("EntityStatus")("$")。 // 当我搜索公司名称并想要检索 LEI 代码时,仍在尝试使用您的代码。不知道我应该如何在For Each... 循环中检索item,因为结构看起来更复杂......
    • 没错。非常感谢!!!谢谢你,我想通了。所以代码是,给定JSON structure, Dim lei As String // lei = Json("data")(1)("attributes")("entity")("legalAddress")("country") 'Country // lei = Json("data")(1)("attributes")("entity")("status") 'Entity Status (Active/Not Active) // lei = Json("data")(1)("attributes")("entity")("legalName")("name") 'Legal name // lei = Json("data")(1)("attributes")("registration")("status").
    • 干得好。打赌你现在阅读 json 感觉更舒服:-)
    最近更新 更多