从HTML表格单元格中提取数据

时间:2015-05-22 12:22:18

标签: html vbscript extract

我想用VBScript从网站(非公共内部网)中提取信息。这个时间总是在网站的同一个字段中,但每个日期都不同,之后我想用这个信息在我的展望中创建一个会议(持续时间总是恰好1小时),恰好在当天这个时间。我很高兴用VBScript打开网站并举行会议,但是我在阅读网站领域的时间信息时遇到了问题。

不幸的是我不能在这里粘贴完整结构的图片,所以我粘贴了我正在寻找的信息的DOM元素:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN"><META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<HTML><BODY id="info_body" aLink="#ff0000" link="#0000ff" bgColor="#ebf7ff" text="#000000" vLink="#800080"><TABLE class="topMargin" border="0" cellSpacing="2" cellPadding="2" width="600" align="center"><TBODY>    <TR class="data">

<TD>
11:42
</TD>

</TR></TBODY></TABLE></BODY></HTML>

这对你有帮助吗?我需要将信息(在本例中为“11:42”)设置为变量和/或将其显示在Msgbox中。 结构是:

html --> body --> iframe (3rd) --> html --> body --> table (1st) --> tbody
--> tr class = "data" --> td (4th)

打开我使用的网站:

SET ie1 = WScript.CreateObject("InternetExplorer.Application", "IE_")
myUrl1="http://xxxx" 'website
hwnd = ie1.hwnd
ie1.Navigate myUrl1

Set oShell = CreateObject("Shell.Application")
For Each Wnd In oShell.Windows
  If hwnd = Wnd.hwnd Then Set ie1 = Wnd
Next 

为了获得我尝试的所需信息:

  1. MsgBox ie.document.body.innerhtml

    工作并给我完整的HTML代码。

  2. getElementsByTagName

  3. firstChild
  4. ie.document.childNodes(0).childNodes(1).childNodes(0).childNodes(0).childNodes(2).childNodes(3)
  5. 我在互联网上发现了这些代码片段,显然它们适用于其他代码片段,但很抱歉,我无法适应我的具体要求和案例。

    更新2015年5月27日:

    有了这个新版本,它大部分时间都可以使用,但不幸的是并不总是......

    Option Explicit
    
    Dim ie, b, url
    Dim hwnd, oshell, wnd
    Dim tbl, iframe, td
    Dim c, Zeit1, start_punkt
    Dim outl, a, myNameSpace, myFolder, myitem, alle_items, myitem_new, olmeeting
    Dim ie_exist
    
    URL = "http://xxxx" 'website
    
    SET ie = WScript.CreateObject("InternetExplorer.Application", "IE_")
    hwnd = ie.hwnd
    ie.Navigate url
    
    Set oShell = CreateObject("Shell.Application")
    For Each Wnd In oShell.Windows
    If hwnd = Wnd.hwnd Then Set ie = Wnd
    Next
    
    DO WHILE ie.ReadyState <> 4
    LOOP
    
    'get 3rd iframe in page
    Set iframe = ie.document.getElementsByTagName("iframe").Item(2).contentWindow
    
    'get 1st table in iframe
    Set tbl = iframe.document.getElementsByTagName("table").Item(0)
    
    'get 4th cell in table
    Set td = tbl.getElementsByTagName("td").Item(8)
    
    Msgbox td.innerText
    

    当它无法正常工作时,我会收到一条未知的错误消息:

    If hwnd = wnd.hwnd then set ie = Wnd
    

    @Ansgar: 如果我删除Set oShell = ...部分,我会收到错误消息:

      

    调用的对象已与其客户端断开连接。

    如果我删除Set oShell = ...部分以及DO WHILE ie.ReadyState循环,我会在行中收到未知错误:

    Set iframe = ie.document.getElementsByTagName("iframe").Item(2).contentWindow
    

    有什么想法吗?至少上面的版本在大多数情况下都有效(每次出错时都会尝试替代版本),但有没有可能解决问题并让它在每次都工作?

1 个答案:

答案 0 :(得分:1)

这样的事情应该做:

url = "http://www.example.com/"

Set ie = CreateObject("InternetExplorer.Application")
ie.Navigate url

While ie.ReadyState <> 4
  WScript.Sleep 100
Wend

'get 3rd iframe in page
Set iframe = ie.document.getElementsByTagName("iframe").Item(2).contentWindow
'get 1st table in iframe
Set tbl = iframe.document.getElementsByTagName("table").Item(0)
'get 4th cell in table
Set td  = tbl.getElementsByTagName("td").Item(3)

MsgBox td.innerText
顺便说一下,这段代码毫无意义,所以放弃它:

Set oShell = CreateObject("Shell.Application")
For Each Wnd In oShell.Windows
  If hwnd = Wnd.hwnd Then Set ie1 = Wnd
Next

当您已经拥有对该实例的引用时,您不需要重新连接到Internet Explorer实例。