我有一个问题 - 我有一个URL:喜欢(http :: //exampl.com/example),当我在浏览器中打开这个页面时,我看到一个带有vertain值的表。这是一个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'(第一个)的值。
我该怎么做?请帮忙!
答案 0 :(得分: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
是否确实包含相关的表格元素。
答案 1 :(得分: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的变化是明智的。
<强> P.S。强>
csFSpec是(完整路径)包含必要标记的给定样本HTML的文件,以使其合法。对于测试,您可以从浏览器中保存为页面。
如果将csURL设置为正确的URL并激活useDom()函数中的getURL()行,则不需要该文件。
<强> P.P.S。强>
为了应对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循环播放(希望)稳定的收藏并进行比较的方式可能会有所帮助。