【发布时间】: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