使用 WinHTTP 抓取表单中的标签输入
Scrape tag input in a form using WinHTTP
我已经使用 WinHTTP
自行克服了连接问题(这是响应文本方法 Debug.Print
的错误)。
所以我必须从一个表单中获取很多值(超过 20 个),然后创建一个字符串并将其传递给 http://exampletry.it/visualizzaelenco.do
以生成 PDF 文件。
这是表单代码的示例。
<BODY>
<form name="trattamentoForm" method="post" action="/ecportal/trattamento_dettaglio.do">
<input type="hidden" name="service" value="">
<input type="hidden" name="ufficioLoggato" value="">
<input type="hidden" name="uff_comp" value="DZT">
<input type="hidden" name="profiloUtente" value="U">
<input type="hidden" name="tipoModelloRicerca.codice" value="V">
<input type="hidden" name="tipoModelloRicerca.descrizioneEstesa" value="V - MODELLO V">
<input type="hidden" name="partRicerca" value="">
<input type="hidden" name="annoRicerca" value="">
<input type="hidden" name="codiceRicerca" value="123456789">
<input type="hidden" name="dataPresRicerca" value="">
<input type="hidden" name="numProtRicerca" value="">
<input type="hidden" name="concessionarioRicerca.codice" value="">
......
那么如何在不使用标记名的情况下获取名称和值呢?我正在使用 WinHTTP,我不想使用 IE 或其他网络浏览器。 (我只能使用 .click
和 VBA 和 IE 来做到这一点)
添加代码
oHtml.body.innerHTML = http.responseText
If http.Status = 200 Then
Set OSTREAM = CreateObject("ADODB.Stream")
OSTREAM.Open
OSTREAM.Type = 1
OSTREAM.Write http.responseBody
File1 = "E:\test.html"
OSTREAM.SaveToFile File1, 2
OSTREAM.Close
End If
Dim html As HTMLDocument
Set html = GetHTMLFileContent("E:\test.html")
Dim list As Object, i As Long
Set list = html.querySelectorAll("trattamentoForm")
For i = 0 To list.length - 1
Debug.Print "Name: " & list.Item(i).Name, "Value: " & list.Item(i).Value
Next
我承认我不清楚您要做什么。假设您在表单中输入标记元素的属性 value
和 name
之后,您可以使用 CSS 选择器来定位所有具有 name 属性的表单元素并读出结果匹配元素的名称和值属性值。此外,假设每个元素都具有名称和值属性(看起来)。
Option Explicit
Public Sub test()
Dim html As HTMLDocument
Set html = New HTMLDocument
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", "yourURL", False
.send
html.body.innerHTML = .responseText
End With
Dim list As Object, i As Long
Set list = html.querySelectorAll("form input[name]")
For i = 0 To list.Length - 1
Debug.Print "Name: " & list.item(i).NAME, "Value: " & list.item(i).Value
Next
End Sub
我已经使用 WinHTTP
自行克服了连接问题(这是响应文本方法 Debug.Print
的错误)。
所以我必须从一个表单中获取很多值(超过 20 个),然后创建一个字符串并将其传递给 http://exampletry.it/visualizzaelenco.do
以生成 PDF 文件。
这是表单代码的示例。
<BODY>
<form name="trattamentoForm" method="post" action="/ecportal/trattamento_dettaglio.do">
<input type="hidden" name="service" value="">
<input type="hidden" name="ufficioLoggato" value="">
<input type="hidden" name="uff_comp" value="DZT">
<input type="hidden" name="profiloUtente" value="U">
<input type="hidden" name="tipoModelloRicerca.codice" value="V">
<input type="hidden" name="tipoModelloRicerca.descrizioneEstesa" value="V - MODELLO V">
<input type="hidden" name="partRicerca" value="">
<input type="hidden" name="annoRicerca" value="">
<input type="hidden" name="codiceRicerca" value="123456789">
<input type="hidden" name="dataPresRicerca" value="">
<input type="hidden" name="numProtRicerca" value="">
<input type="hidden" name="concessionarioRicerca.codice" value="">
......
那么如何在不使用标记名的情况下获取名称和值呢?我正在使用 WinHTTP,我不想使用 IE 或其他网络浏览器。 (我只能使用 .click
和 VBA 和 IE 来做到这一点)
添加代码
oHtml.body.innerHTML = http.responseText
If http.Status = 200 Then
Set OSTREAM = CreateObject("ADODB.Stream")
OSTREAM.Open
OSTREAM.Type = 1
OSTREAM.Write http.responseBody
File1 = "E:\test.html"
OSTREAM.SaveToFile File1, 2
OSTREAM.Close
End If
Dim html As HTMLDocument
Set html = GetHTMLFileContent("E:\test.html")
Dim list As Object, i As Long
Set list = html.querySelectorAll("trattamentoForm")
For i = 0 To list.length - 1
Debug.Print "Name: " & list.Item(i).Name, "Value: " & list.Item(i).Value
Next
我承认我不清楚您要做什么。假设您在表单中输入标记元素的属性 value
和 name
之后,您可以使用 CSS 选择器来定位所有具有 name 属性的表单元素并读出结果匹配元素的名称和值属性值。此外,假设每个元素都具有名称和值属性(看起来)。
Option Explicit
Public Sub test()
Dim html As HTMLDocument
Set html = New HTMLDocument
With CreateObject("WINHTTP.WinHTTPRequest.5.1")
.Open "GET", "yourURL", False
.send
html.body.innerHTML = .responseText
End With
Dim list As Object, i As Long
Set list = html.querySelectorAll("form input[name]")
For i = 0 To list.Length - 1
Debug.Print "Name: " & list.item(i).NAME, "Value: " & list.item(i).Value
Next
End Sub