2013-05-16 51 views
-3

我有一个问题 - 我有一个URL:像(http :: //exampl.com/example),当我在浏览器中打开此页时,我看到一个表具有某些值。下面是一个HTML代码:从VB代码检索数据与VBScript

<p> 
<table> 
<tr><td>RegistrationDTO.setUsername</td> 
<td>0</td> 
<td>0</td> 
<td>1</td> 
<td>1</td> 
</tr> 
<tr><td>RegistrationDTO.getLastName</td> 
<td>0</td> 
<td>0</td> 
<td>3</td> 
<td>3</td> 
</tr> 
<tr><td>RegistrationDTO.getPersonalNumber</td> 
<td>0</td> 
<td>0</td> 
<td>3</td> 
<td>3</td> 
</tr><tr> 
<td>RegistrationDTO.getFirstName</td> 
<td>16</td> 
<td>16</td> 
<td>3</td> 
<td>3</td> 
</tr> 
<tr><td>RegistrationDTO.register</td> 
<td>1068</td> 
<td>1068</td> 
<td>1</td> 
<td>1</td> 
</tr> 

我需要从该表从RegistrationDTO.register =“1068”(第一个)获得的价值。

我该怎么做?请帮忙!

+0

哪种语言? –

+0

我需要使用一个VBScript来实现这个 –

回答

1

有两种方法可以从HTML获取信息。两者都表现出在这里:

Option Explicit 

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject") 

Const csURL    = "http://gent/16584664.html"     ' 'real' const 
Dim csFSpec : csFSpec = goFS.GetAbsolutePathName(".\16584664.html") ' 'pseudo' const 

' use comment or order to select a strategy 
WScript.Quit useDom() 
WScript.Quit useRegExp() 

Function useRegExp() 
    Dim sAll : sAll  = goFS.OpenTextFile(csFSpec).ReadAll() 
    Dim reCut : Set reCut = New RegExp 
    reCut.Global = True 
    reCut.Pattern = "RegistrationDTO.register</td>\s+<td>(\d+)</td>" 
    Dim oMTS : Set oMTS = reCut.Execute(sAll) 
    If 1 = oMTS.Count Then 
    WScript.Echo "success:", oMTS(0).SubMatches(0) 
    Else 
    WScript.Echo "failure" 
    End If 
    useRegExp = 0 
End Function ' useRegExp 

Function useDom() 
    Dim oDOM : Set oDOM = CreateObject("HTMLFILE") 
' Dim sHTML : sHTML = getURL(csURL) 
    Dim sHTML : sHTML = goFS.OpenTextFile(csFSpec).ReadAll() ' for testing 
    oDOM.write sHTML 
    ' descending the tree    HTML   BODY   TABLE   TBODY  5th row  2nd col 
    Dim oItem : Set oItem = oDOM.childNodes(0).childNodes(1).childNodes(0).childNodes(0).childNodes(4).childNodes(1) 
    ' WScript.Echo "success:", oItem.tagName ' drill down help 
    WScript.Echo "success:", oItem.innerHTML 
    ' WScript.Echo "success:", oItem.parentNode.childNodes(2).innerHTML ' verification 
    useDom = 0 
End Function ' useDom 

Function getURL(sURL) 
    Dim oHTTP : Set oHTTP = CreateObject("Msxml2.XMLHTTP") 
    oHTTP.Open "GET", csURL, False 
    oHTTP.Send 
    If 200 = oHTTP.Status Then 
    getURL = oHTTP.responseText 
    Else 
    ' handle error 
    End If 
End Function ' getURL 

输出:

cscript 16584664.vbs 
success: 1068 

正则表达式的方法显然前提是你可以定义一个模式来唯一标识所需的部分。 DOM方法不适用于错误的HTML,并且如果必须按位置获取所需的项目(如本例中那样),可能会很笨拙。两者都对HTML的变化很敏感。

P.S.

csFSpec是(完整路径)包含给定示例HTML文件的必要标记以使其合法。为了测试,您可以从浏览器中保存页面。

如果将csURL设置为正确的URL并在useDom()函数中激活getURL()行,则不需要该文件。

P.P.S.

为了应付略有不同的HTML埃米尔给他(可能很快就被删除)等问题,我不得不在正则表达式模式从改变:

reCut.Pattern = "RegistrationDTO.register</td>\s+<td>(\d+)</td>" 

到:

reCut.Pattern = "RegistrationDTO.register</td>\s*<td>(\d+)</td>" 

处理空白

和钻(更普遍,因此更应该从一开始就做到了)下来来源:

' descending the tree    HTML   BODY   TABLE   TBODY  5th row  2nd col 
Dim oItem : Set oItem = oDOM.childNodes(0).childNodes(1).childNodes(0).childNodes(0).childNodes(4).childNodes(1) 

到:

' descending the tree    HTML   BODY    P  TABLE   TBODY  6th row  2nd col 
    Dim oItem : Set oItem = oDOM.childNodes(0).childNodes(1).childNodes(0).childNodes(0).childNodes(0).childNodes(5).childNodes(2) 

采取额外的P和变更后的行数考虑。

这说明了上面提到的两种策略的脆弱性。 @ Ansgar循环(希望)稳定的收集和比较的方式可能对此有所帮助。

+0

在这两种解决方案中,我遇到了一个错误!是否可以因为这个原因:这是一个Java Web应用程序 –

+0

请你能帮助我,我收到一条错误消息!我不知道要在csFSpec中放置什么:csFSpec!这个页面是用Java编写的!所以它看起来像: localhost:8081/register/monitor?command = getAllStats –

+0

@EmilSyundyukov - 请参阅更新。 –

1

尝试这样:

Set ie = CreateObject("InternetExplorer.Application") 
ie.Navigate "http://example.com/example" 
While ie.Busy : WScript.Sleep 100 : Wend 

For Each tr In ie.document.getElementsByTagName("tr") 
    If InStr(tr.innerText, "RegistrationDTO.register") > 0 Then 
    Set row = tr 
    End If 
Next 

WScript.Echo row.children(1).innerText 

ie.Quit 

对于故障排除,检查什么脚本实际看到,尝试这样的事情:

Set ie = CreateObject("InternetExplorer.Application") 
ie.Visible = True 
ie.Navigate "http://example.com/example" 
While ie.Busy : WScript.Sleep 100 : Wend 
Set fso = CreateObject("Scripting.FileSystemObject") 
fso.OpenTextFile("C:\debug.html", 2, True).Write ie.document.body.innerHtml 

检查C:\debug.html如果它实际上包含表有问题的元素。

+0

在这两个解决方案中,我得到了一个错误!是否可以因为这个原因:这是一个Java Web应用程序 –

+1

它不应该。你会得到什么错误? –

+0

Accodring到您的解决方案: 它打开我的网页在IE浏览器,但后来我得到错误: 线:5 字符:1个 未指定的错误 代码:80004005 来源:(空) –