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