在 VBA 中的 <tr> 或 <td> 标签内抓取 html 数据

Scrape html data within a <tr> or <td> tag in VBA

<tr>
    <td>Tanks:<br /><i>Lost:<br />Destroyed:</i></td>
    <td>750<br /><i>6<br />18</i></td>
</tr>
<tr>
    <td>Tanks:<br /><i>Lost:<br />Destroyed:</i></td>
    <td>750<br /><i>6<br />18</i></td>
</tr>

我正在尝试从 VBA 中具有这样结构的 html 网站抓取数据。我想要的兴趣值是“750”,但它有时可以是 0、1,000,000 或介于两者之间的任何数字,因此要提取的一组字符将不起作用。

谁能提供一些关于抓取它的最佳方法的见解?这是我的代码,它将按原样导入所有文本,但是 post 过程的逻辑和 trim 感兴趣的数据被证明非常困难,所以我正在寻找一种干净的方法来抓取750 插槽不变。

Set elems = IE.document.getElementsByTagName("tr")
    For Each e In elems

        If e.innerText Like "Tanks:*" Then
            msgbox e
        End If

    next e

在行(tr)中,你想要的内容似乎总是在第二个td并且是换行符<br/>之前的第一个内容。 你的HTML的稳定结构好像是:

<tr>
    <td>
    </td>

    <td> 'we look for the first stuff inside here, before the </br> comes
    </td>
</tr>

因此,从您的代码开始:

Set elems = IE.document.getElementsByTagName("tr")
For Each e In elems

If e.innerText Like "Tanks:*" Then 'finding the right <tr>

    'get full HTML inside the <tr></tr>
     fullHTML = e.innerHTML

    'first step: parsing until the second <td> comes out...
    lookFor = "<td>"
    startPos = 8 'we can ignore the first 4, we know that <td> is not the one we look for    
    foundThis = Right(Left(fullHTML,startPos),4) 'store current 4 characters    
    Do While foundThis <> lookFor
        startPos = startPos + 1
        foundThis = Right(Left(fullHTML,startPos),4)
    Loop
    'once out, we can take the string starting from your 750 until the end
    remainingHTML = Right(Left(fullHTML,startPos+6),Len(fullHTML)-startPos)     
    'so now we parse until we encounter the "<" of the break row tag    
    myValue = ""
    startPos = 1
    newParse = Right(Left(remainingHTML,startPos),1)
    Do While newParse <> "<"
        myValue = myValue & newParse
        startPos = startPos + 1
        newParse = Right(Left(remainingHTML,startPos),1)
    Loop    

    MsgBox myValue 'here is your 750, 1,000,000 or whatever else

End If

Next e

请注意,如果您可以在 VBA 项目中引用 JavaScript 库,解析会容易得多。在这种情况下,您可以创建一个子列表:

If e.innerText Like "Tanks:*" Then
    puppies = e.children
    'puppies = ["<td></td>", "<td></td>"]
End If

这样就可以直接解析集合的第二个元素了。 注意 代码未经测试,可能需要在调试中修改以使其正常工作。这只是关于如何构建解析的想法。