发布请求无法从目标页面获取响应

时间:2017-05-13 07:53:53

标签: vba web-scraping xmlhttprequest

当我运行它时,在post请求中编写一个宏,它会带来我不想要的意外响应。也许它无法从目标页面获取响应。无法识别我正在做的错误?我在我的代码下粘贴的原始网址。

执行搜索前要检查的框:

行业角色=专业服务提供商

其他标准= APEX

Sub Xmlpost()
Dim http As New MSXML2.XMLHTTP60
Dim html As New HTMLDocument
Dim Items As Object, Item As Object, Elem As Object
Dim postdata As String

postdata = "DoMemberSearch=1&mas_last=&mas_comp=&mas_city=&mas_stat=&mas_cntr=&mas_type=Professional+Services+Providers&OtherCriteria=1"
With http
    .Open "POST", "https://www.infocomm.org/cps/rde/xchg/infocomm/hs.xsl/memberdirectory.htm", False
    .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    .setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    .send postdata
    html.body.innerHTML = .responseText
End With

Set Items = html.getElementById("paginationDataPool").getElementsByTagName("a")
For Each Item In Items
    x = x + 1
    Cells(x, 1) = Item.innerText
Next Item
End Sub

原始页面:“https://www.infocomm.org/cps/rde/xchg/infocomm/hs.xsl/memberdirectory.htm

搜索应该像:

enter image description here

我得到的输出是:

enter image description here

1 个答案:

答案 0 :(得分:1)

您正在寻找使用类paginationDisplayItem的元素,但此类仅由浏览器中运行的JavaScript动态添加,如下所示:

<div class="paginationDisplayItem">

但是,在html对象中,只有来自POST请求的纯HTML响应。只需将其保存到文件中并查看自己,而不是类属性div包含id属性:

<div id="paginationItem_1">

每个连续条目的尾随数字都会增加一个。

如果您调整循环以根据该ID检索元素,那么一切都将按预期工作。

概念证明:

For x = 1 To 57
    Set Item = html.getElementById("paginationItem_" & x)
    Cells(x, 1) = Item.getElementsByTagName("a")(0).innerText
Next x

在所有情况下,您显然不希望显式循环到57,所以请随意将其重构为您的喜好。

顺便说一句:您应该声明Items As IHTMLElementCollectionItem As IHTMLElement - 这样IntelliSense可以处理您的对象,并且您将具有类型安全性。