2017-06-01 90 views
0

我知道有类似的问题已经回答,但我不知道如果我不明白如何处理解决方案从其他人的答案或我的网站我需要获取信息从复杂。所以,请帮助我。从网站检索数据与VBA Excel

我想从Delphi for PN#13511996得到描述字段,值应该是“3 Way Grey GT 150密封式母连接器组件,最大电流15安培”。有人可以帮助我检查网站,并让我知道如何获得描述?

Sub GetData() 
'Added Microsoft HTML Object library to reff 
'Added Microsoft XML, v6.0 to reff 
    Dim xhr As MSXML2.XMLHTTP60 
    Dim doc As MSHTML.HTMLDocument 
    Dim desc As String 
    Set xhr = New MSXML2.XMLHTTP60 
    With xhr 
     .Open "GET", "http://ecat.delphi.com/feature?search=13511996", False 
     .send 
     If .ReadyState = 4 And .Status = 200 Then 
      Set doc = New MSHTML.HTMLDocument 
      doc.body.innerHTML = .responseText 
     End If 
    End With 
    With doc 
     desc = .getElementsByClassName("ProductDetail.Description").Item(0).innerText 
    End With 

    Debug.Print desc 

End Sub 

回答

0

这是因为你使用GETXMLHTTP请求原始的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 

我希望上述方案解决每个人的过去和未来的问题,这花费了我大量的时间来弄清楚。

+0

非常感谢您的解决方案,我非常感谢有见解的解释是什么导致了这个问题。 – user7226

+0

你能否帮我获得相关产品?我试图找到它的ID或ClassID,但他们都没有给我的名单 – user7226

+0

@ user7226我会检查它,当我有时间 – Tehscript