有没有一种方法可以使用excel vba从html响应文本中获取特定数据

有没有一种方法可以使用excel vba从html响应文本中获取特定数据,excel,vba,web-scraping,Excel,Vba,Web Scraping,我不能手动操作,因此需要为它开发vba;我的VBA代码用于状态字段,用于从网站上抓取数据,如快照所示。我能够获取状态数据,但无法提取快照中黄色突出显示的地址/位置。需要在网站的“E”栏中为每个单独的访问代码(密码)添加密码。我正在连接电流输出。我对刮擦还不熟悉。这是我在E列需要的地址/位置字段的图像。(访问代码在C列) 以下是我的VBA代码: Option Explicit Public Sub GetStatus() On Error GoTo ErrHandler Dim ht

我不能手动操作,因此需要为它开发vba;我的VBA代码用于状态字段,用于从网站上抓取数据,如快照所示。我能够获取状态数据,但无法提取快照中黄色突出显示的地址/位置。需要在网站的“E”栏中为每个单独的访问代码(密码)添加密码。我正在连接电流输出。我对刮擦还不熟悉。这是我在E列需要的地址/位置字段的图像。(访问代码在C列)

以下是我的VBA代码:

Option Explicit

Public Sub GetStatus()

On Error GoTo ErrHandler
    Dim html As MSHTML.HTMLDocument, xhr As Object, colourLkup As Object
    Dim ws As Worksheet, senhas(), i As Long, results()

Call CopyCommentText
    Set ws = ThisWorkbook.Worksheets("Client")
    senhas = Application.Transpose(ws.Range("C2:C" & ws.Cells(ws.Rows.Count, "C").End(xlUp).Row))

    ReDim results(1 To UBound(senhas))

    Set colourLkup = CreateObject("Scripting.Dictionary")
    colourLkup.Add "active1", "green"
    colourLkup.Add "active3", "orange"
    colourLkup.Add "valid", "valid"

    Set html = New MSHTML.HTMLDocument
    Set xhr = CreateObject("MSXML2.XMLHTTP")

    For i = LBound(senhas) To UBound(senhas)
        If senhas(i) <> vbNullString Then
            With xhr
                .Open "POST", "https://nacionalidade.justica.gov.pt/Home/GetEstadoProcessoAjax", False
                .setRequestHeader "User-Agent", "Mozilla/5.0"
                .setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
                .send "SenhaAcesso=" & senhas(i)
                html.body.innerHTML = .responseText
            End With

            Dim nodes As Object, classinfo() As String

            Set nodes = html.querySelectorAll(".active1, .active3")

            classinfo = Split(nodes(nodes.Length - 1).className, Chr$(32))
            results(i) = Replace$(classinfo(1), "step", vbNullString) & "-" & colourLkup(classinfo(2))

 End If
        Set nodes = Nothing
    Next
    ws.Cells(2, 4).Resize(UBound(results), 1) = Application.Transpose(results)

ErrHandler:

'Error No. 1004 occurs in this case if worksheet with the same name already exists

If Err = 91 Then

'MsgBox "Invalid Code" & Chr(10) & Sheet1.Cells(i + 568, 4).Value & " " & "Row" & i + 568
classinfo(1) = "Invalid"
classinfo(2) = "Valid"


Resume Next
End If

Call CopyCommentText

Call Copy_With_AutoFilter1

End Sub
选项显式
公共子状态()
关于错误转到错误处理程序
将html变暗为MSHTML.HTMLDocument,将xhr变为对象,将Color-Up变为对象
将ws设置为工作表、senhas()、i设置为长、结果()
调用CopyCommentText
设置ws=ThisWorkbook.Worksheets(“客户端”)
senhas=Application.Transpose(ws.Range(“C2:C”和ws.Cells(ws.Rows.Count,“C”).End(xlUp.Row))
ReDim结果(1至UBound(senhas))
设置colourkup=CreateObject(“Scripting.Dictionary”)
颜色组合。添加“活动1”、“绿色”
加上“活性3”,“橙色”
配色方案。添加“有效”、“有效”
Set html=New MSHTML.HTMLDocument
设置xhr=CreateObject(“MSXML2.XMLHTTP”)
对于i=LBound(senhas)到UBound(senhas)
如果senhas(i)vbNullString,则
使用xhr
.打开“POST”https://nacionalidade.justica.gov.pt/Home/GetEstadoProcessoAjax”“错
.setRequestHeader“用户代理”、“Mozilla/5.0”
.setRequestHeader“内容类型”,“应用程序/x-www-form-urlencoded;字符集=UTF-8”
.send“SenhaAcesso=”&senhas(i)
html.body.innerHTML=.responseText
以
Dim节点作为对象,classinfo()作为字符串
Set nodes=html.querySelectorAll(“.active1.active3”)
classinfo=Split(节点(nodes.Length-1).className,Chr$(32))
结果(i)=替换$(classinfo(1),“step”,vbNullString)&“-”和颜色库(classinfo(2))
如果结束
设置节点=无
下一个
ws.Cells(2,4).Resize(UBound(results),1)=Application.Transpose(results)
错误处理程序:
'如果已存在同名工作表,则在这种情况下会出现错误1004
如果Err=91,则
'MsgBox“无效代码”&Chr(10)&Sheet1.Cells(i+568,4)。Value&&“行”&i+568
classinfo(1)=“无效”
classinfo(2)=“有效”
下一步继续
如果结束
调用CopyCommentText
使用自动过滤器1调用Copy\u
端接头
这是我制作的密码输出,因为它是保密的

下面是我使用调试打印得到的响应文本

尝试以下方法获取地址:

Public Sub GetAddress()
    Const pUrl$ = "https://nacionalidade.justica.gov.pt/Home/GetEstadoProcessoAjax"
    Dim Html As New HTMLDocument, Xhr As New XMLHTTP60
    Dim address$

    With Xhr
        .Open "POST", pUrl, False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
        .send "SenhaAcesso=0908-1378-1843"
        Html.body.innerHTML = .responseText
    End With

    address = Html.querySelector("#block_container + div[style*='bold']").innerText

    MsgBox address
End Sub

请尝试以下操作以获取地址:

Public Sub GetAddress()
    Const pUrl$ = "https://nacionalidade.justica.gov.pt/Home/GetEstadoProcessoAjax"
    Dim Html As New HTMLDocument, Xhr As New XMLHTTP60
    Dim address$

    With Xhr
        .Open "POST", pUrl, False
        .setRequestHeader "User-Agent", "Mozilla/5.0"
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
        .send "SenhaAcesso=0908-1378-1843"
        Html.body.innerHTML = .responseText
    End With

    address = Html.querySelector("#block_container + div[style*='bold']").innerText

    MsgBox address
End Sub

请提供一个示例访问代码“0908-1378-1843”供您参考。请提供一个示例访问代码“0908-1378-1843”供您参考。如果您喜欢坚持传统方法,这就是如何实现相同的
address=Html.getElementById(“块容器”).NextSibling.innerText
。当我需要通过一系列访问代码(senhas)时,需要一些指导。您可以这样修改吗?另外,您可以在代码中进行调整吗?因为我这里有700到800个senhas,对于单个访问代码,代码工作正常。感谢alotIf如果您喜欢坚持传统方法,这就是如何实现相同的
address=Html.getElementById(“block_container”).NextSibling.innerText
。需要一些指导,因为我需要传递一系列访问代码(senhas)你们能用那个种方式修改吗?你们能在代码中调整吗?因为我这里有700到800个senhas,对于单访问代码来说,代码工作得很好。非常感谢