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