javascript - 在 Excel VBA 中保存网页中 javascript 函数的结果
问题描述
我正在用 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
解决方案
谢谢大家的帮助。通过添加以下代码行,我实际上得到了我想要的。在执行 java 脚本的最后一行之后,我在 execScript() 之后添加了以下行:
document.getElementbyId('div id name').innerHTML.
这个“div”是通过脚本生成的,在“查看源代码”中可见。通过这个,我能够访问该表。它返回了一个字符串,其中包含该 'div' 中的 'Table.../Table' 部分。我通过字符串操作提取了数据。不知道,它是如何工作的,但我得到了我想要的。谢谢大家的宝贵建议。
推荐阅读
- android - 带有 FragmentPagerAdapter 的匕首 - android
- database - 什么方法最适合创建在线 Web 可访问数据库?
- php - 带有 PHP 和复选框的图像
- xml - 如何分离前三个 XML 标记并创建 XML
- angular - Angular - 在库中使用应用程序主题
- java - 当我只想为特定单元格着色时,JTable 正在为每个单元格着色
- c++ - 1080x1920 分辨率的 SDL 原点轴错误
- java - 如何使用 org.json 使用数组?
- ios - 在 tableview rx 数据源中拉动以刷新
- html - Flask Boostrap 背景图像选项