在VBA中的标签或标签内截取HTML数据

时间:2015-01-05 19:45:54

标签: html excel-vba web-scraping vba excel

<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结构的网站中抓取数据。我想要的利益价值是&#34; 750&#34;但它有时可以是0,1,000,000,或介于两者之间的任何数字,因此要提取的设定数量的字符不起作用。

任何人都可以提供一些有关刮擦这种方法的最佳方法的见解吗?这是我的代码将按原样导入所有文本,但是发布过程和修剪感兴趣的数据的逻辑证明是非常困难的,所以我正在寻找一个很好的清洁方式来刮掉750插槽。

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

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

    next e

1 个答案:

答案 0 :(得分:1)

在行(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

像这样,你可以直接解析集合的第二个元素。 注意代码未经过测试,可能需要在调试中进行修改才能使其正常运行。这只是一个如何构建解析的想法。