使用VBA从Web文档输入元素获取值

时间:2014-12-23 15:12:03

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

我很难从名为300的输入中检索值points

这是我的HTML和VBA代码。

HTML

<td id="myPower_val_9" style="visibility: visible;">
    <input type="text" disabled="disabled" value="300" name="points"></input>
</td>

VBA

Dim ie As Object
Dim myPoints As String

Set ie = CreateObject("InternetExplorer.Application")

With ie
  .Visible = 0
  .navigate "www.example.com"

   While .Busy Or .readyState <> 4 
   DoEvents
   Wend

End With

Dim Doc As HTMLDocument
Set Doc = ie.document

myPoints = Trim(Doc.getElementsByTagName("td")(0).getElementById("myPoints").innerText)
Range("A1").Value = myPoints 

3 个答案:

答案 0 :(得分:4)

HTML代码

我尝试在Web浏览器中编写用于在javascript中操作文档对象模型(DOM)的代码,以便您可以使用更好的基于Web的调试工具。

这里有几个问题,控制台或调试器可以提供帮助:

  • 您希望获取元素ID myPoints,但在HTML中,它只是名为points
  • 您希望按ID获取元素,但您只设置了name属性 -
  • 只要name对于元素而言是唯一的,您就不需要首先搜索td
  • <input></input>可以看出,输入元素没有innerText><内的文字)。相反,他们有一个value属性
  • 元素通过对象本身的属性公开它的属性和其他数据。因此,您只需查看.value
  • 即可查看输入值

以下是您尝试做的一个javascript示例:

&#13;
&#13;
var value = document.getElementsByName("points")[0].value;
console.log(value);
&#13;
<input type="text" disabled="disabled" value="300" name="points" />
    
&#13;
&#13;
&#13;

打开控制台( F12 ),你应该看到300

VBA

要将其转换为Excel的VBA代码,只需确保对VB数组使用括号()而不是JS数组的方括号[]

myPoints = Trim(Doc.getElementsByName("points")(0).Value)

这应该可以正常工作。

参考

由于我不确定您在VB中失败了什么时候,还要确保您的VBA脚本中有适当的Web引用。

转到工具&gt;参考文献&gt;并添加&#34; Microsoft HTML Object Library&#34;和#34; Microsoft Internet Controls&#34;:

References

演示

我创建了一个demo in plunker,因此会有一个现场网站而不是example.com。

将以下代码粘贴到excel中,一切都应该正常工作:

Public Sub GetValueFromBrowser()
    Dim ie As Object
    Dim url As String
    Dim myPoints As String

    url = "http://run.plnkr.co/plunks/6UTb9kHRZ363Ivhh2BPE/"
    Set ie = CreateObject("InternetExplorer.Application")

    With ie
      .Visible = 0
      .navigate url
       While .Busy Or .readyState <> 4
         DoEvents
       Wend
    End With

    Dim Doc As HTMLDocument
    Set Doc = ie.document

    myPoints = Trim(Doc.getElementsByName("points")(0).Value)
    Range("A1").Value = myPoints

End Sub

<强>输出

output

答案 1 :(得分:1)

CSS选择器:

使用CSS选择器获取input[name='points']的元素

您没有显示足够的HTML来知道这是否是页面上唯一的。上面说的是带有input标签的元素,其属性为name,其值为'points'


CSS查询:

CSS query


VBA:

您可以通过.querySelector的{​​{1}}方法将CSS选择器应用于单个元素; document代表所有匹配元素中的.querySelectorAll,也就是说,如果页面上有多个元素,并且您按索引得到了一个感兴趣的元素。

nodeList

答案 2 :(得分:0)

您需要使用.getAttribute("name of attribute")来获取属性值。在您的情况下,.getAttribute("value")将返回300。

Dim ie As Object
Dim myPoints As String

Set ie = CreateObject("InternetExplorer.Application")

With ie
  .Visible = 1
  .navigate "website URL"

   While .Busy Or .readyState <> 4
   DoEvents
   Wend

End With

Dim Doc As HTMLDocument
Set Doc = ie.document

myPoints = Trim(Doc.getElementsByTagName("td")(0).getElementsByTagName("input")(0).getAttribute("value"))
Range("A1").Value = myPoints

只是旁注。我不太了解HTML,也许有人可以详细说明这一点。但是如果你想测试你需要在&lt;中添加的HTML代码。表&gt; &LT; TR&GT;标签。
这样的事情:

<table>
    <tr>
        <td id="myPower_val_9" style="visibility: visible;">
            <input type="text" disabled="disabled" value="300" name="points"></input>
        </td>
    </tr>
</table>