【问题标题】:retrieve data from html code with vbscript使用 vbscript 从 html 代码中检索数据
【发布时间】:2014-02-25 02:10:45
【问题描述】:

我有一个问题 - 我有一个 URL:like (http:://exampl.com/example),当我在浏览器中打开此页面时,我看到一个包含不同值的表格。这是一个 HTML 代码:

<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'(第一个)的值。

我该怎么做?请帮忙!

【问题讨论】:

  • 我需要使用vbscript来实现这个

标签: http 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

RegExp 方法显然预先假定您可以定义一个模式来唯一标识所需的部分。 DOM 方法不适用于错误的 HTML,如果您必须按位置获取所需的项目(如本例中),则可能会很笨拙。两者都对 HTML 的变化很敏感。

附言

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

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

附言

为了应对 Emil 在他的其他问题(可能很快将被删除)中给出的略有不同的 HTML,我不得不将 RegExp 模式从:

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 循环(希望)稳定的集合并进行比较的方式在这里可能会有所帮助。

【讨论】:

  • 在这两种解决方案中我都遇到了错误!会不会是因为这个原因:这是一个Java web应用程序
  • 拜托,你能帮帮我吗,我收到一条错误消息!我不知道在 csFSpec 中放什么:csFSpec!这个页面是用Java制作的!所以它看起来像:localhost:8081/register/monitor?command=getAllStats
【解决方案2】:

试试这样的:

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 是否确实包含有问题的表格元素。

【讨论】:

  • 在这两种解决方案中我都遇到了错误!会不会是因为这个原因:这是一个Java web应用程序
  • 根据您的解决方案:它在 IE 中打开我的页面,但随后出现错误:Line: 5 Char: 1 Unspecified Error Code: 80004005 Source: (null)
  • 写入文件未找到错误
  • 抱歉回答太久了!我已经尝试了您的代码,但又收到了一个错误:第 6 行字符 1 未指定错误。代码 80004005 来源:null
  • 运行上述代码后,浏览器窗口应该是可见的。页面是否实际加载?当您尝试ie.document.documentElement.outerHtml 而不是ie.document.body.innerHtml 时,您得到相同的结果吗? WScript.Echo TypeName(ie.document) 的输出是什么?
猜你喜欢
  • 2010-09-18
  • 2013-07-28
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2017-06-29
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多