【问题标题】:Post request can't fetch response from targeted page发布请求无法从目标页面获取响应
【发布时间】:2017-05-13 18:49:44
【问题描述】:

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

执行搜索前要检查的框:

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

其他标准 = 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

搜索应该是这样的:

我得到的输出是这样的:

【问题讨论】:

  • 您的代码对我有用,它检索成员目录。究竟是什么问题?你希望有什么不同?
  • 感谢 Leviathan 先生的回答。我正在上传一张我最终得到的照片。
  • 是的,我也一样。对我来说它看起来非常好。我重复我的问题:“你希望有什么不同?”
  • 再次感谢 Leviathan 先生的回复。如果我对我在代码中所写的内容是正确的,那么您不认为我应该从该页面获取名称列表。顺便说一句,我已经编辑了我的帖子以适合搜索名称。
  • 抱歉,Leviathan 先生,您说的确实是对的。我刚刚检查了使用 A 标签来抓取我得到的内容,是的,它确实从该目标页面获取名称。我想知道为什么编辑后的代码无法解析名称。

标签: vba web-scraping xmlhttprequest


【解决方案1】:

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

<div class="paginationDisplayItem">

但是,在您的html 对象中,只有来自您的 POST 请求的纯 HTML 响应。只需将其保存到文件中并自己查看,而不是 class 属性,相同的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 将在您的对象上工作并且您将获得类型安全。

【讨论】:

  • 我刚刚找到了您在此处解释的内容。事实上,查看源代码是我在编写代码时不应该忘记的重要因素之一。你的建议使我到达那里。现在,编辑后的代码可以工作了。谢谢。
猜你喜欢
  • 2023-02-01
  • 2018-01-26
  • 2017-09-15
  • 2020-04-20
  • 1970-01-01
  • 2013-07-15
  • 2017-07-29
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多