如何查找每次运行代码的具体位置

时间:2017-12-15 13:38:21

标签: html vba excel-vba getelementbyid getelementsbytagname

下面的代码将为当天的每个小时提取一个值。

然而,我正在抓取的网页可以改变,所以我想找到一种方法来将变量的位置分配给变量,以便它知道每次的数字。我通过反复试验找到了当前的数字“116”。

我也包含了下面的html结构。有什么建议?

Sub scrape()
    Dim IE As Object
    Set IE = CreateObject("InternetExplorer.application")
    With IE
        .Visible = False
        .navigate "web address"
        Do Until .readyState = 4
            DoEvents
        Loop
        .document.all.item("Login1_UserName").Value = "user"
        .document.all.item("Login1_Password").Value = "pw"
        .document.all.item("Login1_LoginButton").Click
        Do Until .readyState = 4
            DoEvents
        Loop
    End With

    Dim htmldoc As Object
    Dim r
    Dim c
    Dim aTable As Object
    Dim TDelement As Object
    Set htmldoc = IE.document

    Dim td As Object
    For Each td In htmldoc.getElementsByTagName("td")
        On Error Resume Next
        If span.Children(0).id = "ctl00_PageContent_grdReport_ctl08_Label50" Then
            ThisWorkbook.Sheets("sheet1").Range("j8").Offset(r, c).Value = td.Children(1).innerText
        End If
        On Error GoTo 0
    Next td
End Sub

HTML:     

<form name="aspnetForm" id="aspnetForm" action="./MinMaxReport.aspx" 
method="post">
<div>
</div>
<script type="text/javascript">...</script>
<div>
</div>
<table class="header-table">...</table>
<table class="page-area">              
<tbody>
<tr>
<table id="ctl00_PageContent_Table1" border="0">...</table>
<table id="ctl00_PageContent_Table2" border="0">
<tbody>
<tr>
<td>
<div id="ctl00_PageContent_grdReport_div">
<tbody>
<tr style="background-color: beige;">
<td>...</td>
<td>
<span id="ctl00_PageContent_grdReport_ctl08_Label50">Most Restrictive 
Capacity Maximum</span>
</td>
<td>
<span id="ctl00_PageContent_grdReport_ctl08_Label51">159</span>
</td>                                     
</tr>		
</tbody>
</div>
</td>
</tr>
</tbody>
</table>
</table>
</tr>
</tbody>
</table>

1 个答案:

答案 0 :(得分:0)

你可以遍历所有的TD并检查id =&#34; ctl00_PageContent_grdReport_ctl08_Label50&#34;例如:

For Each td In htmldoc.getElementsByTagName("td")
    On Error Resume Next
        If td.Children(0).ID = "ctl00_PageContent_grdReport_ctl08_Label50" Then
            ThisWorkbook.Sheets("sheet1").Range("j8").Offset(r, c).Value = td.Children(1).innerText
        End If
    On Error GoTo 0
Next td

Children(0)将选择表格单元格中包含的第一个iHTML元素。 On Error Resume Next是针对td元素没有子元素的情况。 您的网页中可能有多个具有此ID的元素。然后,您必须首先识别表或表行。我无法做到,因为我无法看到您的整个HTML代码。