這是因爲你使用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