这是因为你使用GET
从XMLHTTP
请求原始的HTML。如果您尝试使用Debug.Print doc.body.innerHTML
,则会看到该表格尚未生成,并且您正在查找的文本根本不存在。
为了能够运行项目“13511996”的查询,您需要一个真正的浏览器。只有这样你才能生成你的表并获取DOM文档对象。试试下面的代码:
Sub GetData()
Dim aIE As InternetExplorer
Dim desc As IHTMLElement
Set aIE = New InternetExplorer
With aIE
.navigate "http://ecat.delphi.com/feature?search=13511996"
.Visible = True '----> set it to false if you dont want to see the browser
End With
Do While (aIE.Busy Or aIE.ReadyState <> READYSTATE_COMPLETE)
DoEvents
Loop
Set desc = aIE.document.getElementsByClassName("DetailAttributes")(0)
'Debug.Print desc.innerText '---> prints the whole table data
Debug.Print Split(desc.innerText, vbLf)(3) '----> prints the forth data in table
Set aIE = Nothing
Set desc = Nothing
End Sub
而且如果你还计划自动运行该代码在多个查询运行一个循环,你可能想使用:的
Set desc = Nothing
For i = 1 To 100
On Error Resume Next
Set desc = aIE.document.getElementsByClassName("DetailAttributes")(0)
If Err.Number = 91 Then
GoTo Skip
End If
Exit For
Skip:
Application.Wait (Now() + TimeValue("00:00:001"))
Next i
代替:
Set desc = aIE.document.getElementsByClassName("DetailAttributes")(0)
这是因为有时网页在完全生成其内容之前似乎已准备就绪。这会导致代码退出do loop
并继续执行下一个设置desc
对象的语句。设置它时不会出现错误,因为代码将使用以前的DOM文档对象,并将输出先前查询的结果,这是一个错误。没有任何错误,你的代码将运行循环直到结束,并且你的手中会有完全扭曲的输出,这是浪费时间。
要解决此问题,应事先将对象设置为nothing
,并捕获错误并等待页面加载到for loop
。
最后但并非最不重要的一点,如果构建您正在解析的网页的人知道他们在做什么,他们可能会保护它免受来自同一来源的多个查询(很可能来自多个来源)如果他们不这样做,可能会导致他们的服务器崩溃。这种保护将在有限的时间内作为有限数量的查询反映给您。换句话说,例如在5分钟内100次请求之后,网页在某个时间(例如2分钟)不会响应。
要解决此问题,您应该限制请求的数量并等待所需的时间。假设你用i
变量增加你的循环。然后,你需要在你的循环末尾插入这样的:
If i Mod 100 = 0 Then
Application.Wait (Now() + TimeValue("00:02:00"))
End If
我希望上述方案解决每个人的过去和未来的问题,这花费了我大量的时间来弄清楚。
非常感谢您的解决方案,我非常感谢有见解的解释是什么导致了这个问题。 – user7226
你能否帮我获得相关产品?我试图找到它的ID或ClassID,但他们都没有给我的名单 – user7226
@ user7226我会检查它,当我有时间 – Tehscript