【问题标题】:Save result of javascript function from web page in Excel VBA在 Excel VBA 中保存网页中 javascript 函数的结果
【发布时间】:2019-01-07 21:02:00
【问题描述】:

我正在用 excel 编写一个宏,用于从特定网页抓取网页。我可以进入网页。问题是,在那个页面中,有一个超链接,它与生成 html 表的 java 脚本函数相关联。我想从这个表中获取数据。但是,这个动态创建的表没有出现在“查看源代码”中,我无法访问它。我将在这里分享Java脚本函数。


表格:


JS函数生成表:

function create_table(ret,pshow){
var l_Count = ret.getElementsByTagName("td").length; 
if(l_Count>0){
var cols = ret.getElementsByTagName("th").length;   
var rows = l_Count/cols;
var tbl=document.createElement('table');
tbl.setAttribute('class','t20Report t20Standard');
tbl.style.borderCollapse="collapse";
var tbdy=document.createElement('tbody');
var tr=document.createElement('tr');
    for(var k=0;k<cols;k++){
        var th=document.createElement('th');
th.setAttribute('class','t20ReportHeader');
th.appendChild(document.createTextNode(ret.getElementsByTagName("th")[k].firstChild.nodeValue));
        tr.appendChild(th);
    }
tbdy.appendChild(tr);
var r=0;
for(var i=0;i<rows;i++){
    var tr=document.createElement('tr');
    for(var j=0;j<cols;j++){
        var td=document.createElement('td');
td.setAttribute('class','t20data');
     td.appendChild(document.createTextNode(ret.getElementsByTagName("td")[r].firstChild.nodeValue));
r++;
        tr.appendChild(td);
    }
    tbdy.appendChild(tr);
}``
tbl.appendChild(tbdy);
pshow.appendChild(tbl);
}
else
{
var t=document.createTextNode("DATA NOT AVAILABLE");
pshow.appendChild(t);
}

这会生成如下 HTML 代码。


表格的 HTML:

<table class="t20Report t20Standard" style="border-collapse: collapse;">
<tbody>
<tr>
<th class="t20ReportHeader">Switch</th><th class="t20ReportHeader">NE</th>
<th class="t20ReportHeader">port_card_slot</th>
<th class="t20ReportHeader">Vertical</th>
<th class="t20ReportHeader">Pillar</th>
<th class="t20ReportHeader">OUT CT Box</th>
<th class="t20ReportHeader">OUT Tag</th>
<th class="t20ReportHeader">IN CT Box</th>
<th class="t20ReportHeader">IN Tag</th>
<th class="t20ReportHeader">DP</th>
<th class="t20ReportHeader">DP Tag</th>
<th class="t20ReportHeader">DP Type</th>
</tr>
<tr>
<td class="t20data">KKDPVLO01</td>
<td class="t20data">0003-02-117</td>
<td class="t20data">00</td>
<td class="t20data">1-001-01-013</td>
<td class="t20data">KKDPVL0062</td>
<td class="t20data">B2</td>
<td class="t20data">075</td>
<td class="t20data">A1</td>
<td class="t20data">013</td>
<td class="t20data">KKDPVL0062X0018</td>
<td class="t20data">004</td>
<td class="t20data">DP-DL</td>
</tr>
</tbody>
</table>

我无法通过 VBA 访问它。

顺便说一句,我使用的是 IE6,我只能在 IE6 中执行此操作,并且上面的 HTML 代码是我通过 Google chrome 从其他系统获得的,使用“Inspect”。 但是在 IE6 中,我只能看到“查看源代码”,而在这里,它没有显示上面生成的 HTML。

代码:

 Sub scrape()
        Dim ie As Object
        Dim baseurl As String
    
        Set ie = CreateObject("internetexplorer.application")
    
        With ie
            .navigate "http://itpc.sdc.bsnl.co.in:7777/pls/apex/f?p=204:1"
            .Visible = True
        End With
    
        Do While ie.Busy
            DoEvents
        Loop
    
        ie.document.getElementById("P101_USERNAME").Value = "b200800935"
        ie.document.getElementById("P101_PASSWORD").Value = "xxxxxxxx"
    
        Do While ie.Busy
            DoEvents
        Loop
    
        For Each l In ie.document.getElementsByTagName("a")
            If l.className = "t20Button" Then
                l.Click
                Exit For
            End If
        Next
    
        Do While ie.Busy
            DoEvents
        Loop
    
        'baseurl = Replace(ie.LocationUrl, "204", "124")
        'MsgBox ie.LocationUrl
        'MsgBox Replace(ie.LocationUrl, "204", "124") & "::NO::HOME_APP,HOME_PAGE:204,1"
    
        ie.navigate Replace(ie.LocationURL, "204", "124") & "::NO::HOME_APP,HOME_PAGE:204,1"
    
        Do While ie.Busy
            DoEvents
        Loop
    
        ie.document.getElementById("PHONE_NO").Value = "04565-282200"
        ie.document.getElementById("P1_GO").Click
    
        Do While ie.Busy
            DoEvents
        Loop
    
        For Each l In ie.document.getElementsByTagName("a")
            If l.innerText = "04565-282200" Then
                l.Click
                Exit For
            End If
        Next
    
        Do While ie.Busy
            DoEvents
        Loop
    
        ie.document.parentWindow.execScript "ajaxcall('CIRCUITS','CKT_LINK','CIRCUITS')"
    
        ' THE CODE IS OK UPTO THIS
        'THE ABOVE EXECUTION OF JAVASCRIPT FUNCTION CREATES A DYNAMIC TABLE IN WEB PAGE
        'WHICH IS NOT ACCESSIBLE IN VBA BY MY CODE
        ''ie.Quit
        ''Set ie = Nothing
    End Sub

【问题讨论】:

  • 嗯,如果您在内置浏览器中打开页面(菜单 -> 数据 -> 来自 web ),javascript 会运行吗?如果是这样,您可以在那里选择生成的表,从而宏化这些操作。我们还在 VBA 中使用CreateObject() 来创建 AJAX 调用和 JScript 解析器来帮助我们解决这些问题,但由于您似乎使用的是非常旧的软件,我无法保证您使用的版本中存在这些。
  • 当然。我已经添加了代码。
  • 我附上了一张图片。我只关心第四个标题为“电路详细信息”的表。它是通过上面的javascript代码生成的。
  • 谢谢。您还可以显示附加事件的html吗?
  • 查看周围的 html 会有所帮助。您是否检查过它没有嵌套在 Form/Frame/iFrame 中?或者如果有一个不可选择的指示?甚至是不同的起源。

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


【解决方案1】:

感谢大家的帮助。通过添加以下代码行,我实际上得到了我想要的。在执行 java 脚本的最后一行之后,我在 execScript() 之后添加了以下行:

document.getElementbyId('div id name').innerHTML。

这个“div”是通过脚本生成的,在“查看源代码”中可见。通过这个,我能够访问该表。 它返回了一个字符串,其中包含该 'div' 中的 'Table.../Table' 部分。我通过字符串操作提取了数据。不知道,它是如何工作的,但我得到了我想要的。谢谢大家的宝贵建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 2019-08-06
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多