返回列表 上一主題 發帖

[發問] 請教網頁捉取的問題? CreateObject("msxml2.xmlhttp") 的問題?

[發問] 請教網頁捉取的問題? CreateObject("msxml2.xmlhttp") 的問題?

請教網頁捉取的問題? CreateObject("msxml2.xmlhttp") 的問題?
  1. Sub test() '取損益表(年表)網頁
  2. Dim Url, HTMLsourcecode, GetXml, TableG, i, j
  3. Set HTMLsourcecode = CreateObject("htmlfile")
  4. Set GetXml = CreateObject("msxml2.xmlhttp")
  5. Url = "http://kgieworld.moneydj.com/z/zc/zcq/zcqa/zcqa_2330.djhtm"
  6. With GetXml
  7. .Open "GET", Url, False
  8. .send

  9. ' Debug.Print .document.all(0).getElementsByTagName("div")(0).outerHTML
  10.   ' Debug.Print .document.all(0).getElementsByClassName("t11")(0).outerHTML
  11. ' Debug.Print .document.all(0).getElementsByClassName("table-row")(11).outerHTML
  12. '  Debug.Print .document.all(0).getElementsByClassName("t4t1 table-cell")(2).outerHTML
  13.   'Debug.Print .document.all(0).getElementsByClassName("t3n1 table-cell")(0).outerHTML
  14.   'Debug.Print .document.all(0).getElementsByClassName("t3n1 table-cell")(482).outerHTML
  15.   Debug.Print .document.all(0).getElementsByClassName("t3n1 table-cell")(482).innerHTML

  16. Debug.Print "test"
  17. End With
  18. Set HTMLsourcecode = Nothing '釋放記憶體
  19. Set GetXml = Nothing
  20. End Sub '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
複製代碼
請教大大,網頁改版,試修改程式,Debug.Print .document.all(0).getElementsByClassName("t3n1 table-cell")(482).innerHTML
用CreateObject("InternetExplorer.Application")可執行,用CreateObject("msxml2.xmlhttp") 會錯誤,請問如何修改,謝謝

回復 22# GBKEE


    謝謝 版大 改過就可以了, 從中學習很多
  1.        Do  '  程式運行速度快用迴圈,確保TableG物件下載完整
  2.             Set TableG = HTMLsourcecode.all.tags("div")
  3.             DoEvents
  4.             N = N + 1
  5.             '**   "JScriptTypeInfo"  可在 區域變數視窗 查看
  6.             Debug.Print TypeName(TableG) & N
  7.             '** 或是   Debug.Print TypeName(TableG) 得知
  8. '        Loop Until TypeName(TableG) = "JScriptTypeInfo"
  9.         Loop Until TypeName(TableG) = "DispHTMLElementCollection"
複製代碼

TOP

回復 22# GBKEE


謝謝 版大
F8 執行

物件名稱不一樣
Object/DispHTMLElementCollection

TOP

本帖最後由 GBKEE 於 2022-1-12 13:53 編輯

回復 21# wufonna

   
上圖你PC環境中 TypeName(TableG)
下圖我PC環境中 程式碼TypeName(TableG) 不一樣
這裡要修改一下

[
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 20# GBKEE


    謝謝 版主,我執行程式沒停止,用 debug 測試,在這段裡迴圈
  1.        Do  '  程式運行速度快用迴圈,確保TableG物件下載完整
  2.             Set TableG = HTMLsourcecode.all.tags("div")
  3.             DoEvents
  4.             '**   "JScriptTypeInfo"  可在 區域變數視窗 查看
  5.             '** 或是   Debug.Print TypeName(TableG) 得知
  6.             N = N + 1
  7.             
  8.             Debug.Print TypeName(TableG) & N
  9.         Loop Until TypeName(TableG) = "JScriptTypeInfo"
複製代碼

Image 1.jpg (161.21 KB)

Image 1.jpg

TOP

本帖最後由 GBKEE 於 2022-1-12 10:00 編輯

回復 18# wufonna
多寫幾行試試試試看
  1. Private Sub GetIncome() '取損益表(年表)網頁
  2.     Dim Url, HTMLsourcecode, GetXml, TableG As Object, i As Integer, j As Integer, a As Integer
  3.     Set HTMLsourcecode = CreateObject("htmlfile")
  4.     Set GetXml = CreateObject("msxml2.xmlhttp")
  5.     Url = "http://kgieworld.moneydj.com/z/zc/zcq/zcqa/zcqa_2330.djhtm"
  6.     With GetXml
  7.         .Open "GET", Url, False
  8.         .send
  9.         HTMLsourcecode.write .Responsetext
  10.         Do  '  程式運行速度快用迴圈,確保TableG物件下載完整
  11.             Set TableG = HTMLsourcecode.all.tags("div")
  12.             DoEvents
  13.             '**   "JScriptTypeInfo"  可在 區域變數視窗 查看
  14.             '** 或是   Debug.Print TypeName(TableG) 得知
  15.         Loop Until TypeName(TableG) = "JScriptTypeInfo"   
  16.           '*****得知 classname="table-row" 的位置
  17.         For a = 0 To TableG.Length - 1
  18.             'Debug.Print a, TableG(a).classname
  19.             If TableG(a).classname = "table-row" Then Exit For   '讀取資料起始列數
  20.         Next
  21.         '***************************************
  22.        With ActiveSheet
  23.             .Cells.Clear
  24.             For i = a To TableG.Length - 1
  25.                 For j = 0 To TableG(i).all.tags("span").Length - 1
  26.                     .Cells(i - (a - 1), j + 1) = TableG(i).all.tags("span")(j).innertext
  27.                     '****** i - ( a-1) >>修正從第一列開始下載資料
  28.                 Next j
  29.             Next i
  30.         End With
  31.         '***網頁的編碼**********************************
  32.         '<div class="table-row">   為所要的資料 的網頁元素
  33.         '<span class="t2 table-cell">期別</span>
  34.         '<span class="t2 table-cell">2020</span>
  35.         '<span class="t2 table-cell">2019</span>
  36.         '<span class="t2 table-cell">2018</span>
  37.         '<span class="t2 table-cell">2017</span>
  38.         '<span class="t2 table-cell">2016</span>
  39.         '<span class="t2 table-cell">2015</span>
  40.         '<span class="t2 table-cell">2014</span>
  41.         '<span class="t2 table-cell">2013</span>
  42.         '</div>************************************
  43.     End With
  44.     Set HTMLsourcecode = Nothing '釋放記憶體
  45.     Set GetXml = Nothing
  46. End Sub '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 14# GBKEE


    這次網頁改版,抓取的有的股票行數不同,像金融股那一段取B67欄就不在那行,就嘗試用find ,全部上市可以跑完。

TOP

回復 14# GBKEE
  1. Sub GetIncome() '取損益表(年表)網頁
  2. Dim Url, HTMLsourcecode, GetXml, TableG, i, j
  3. Set HTMLsourcecode = CreateObject("htmlfile")
  4. Set GetXml = CreateObject("msxml2.xmlhttp")
  5. Url = "http://kgieworld.moneydj.com/z/zc/zcq/zcqa/zcqa_2330.djhtm"
  6. With GetXml
  7. .Open "GET", Url, False
  8. .Send
  9. HTMLsourcecode.body.innerhtml = .Responsetext
  10. Set TableG = HTMLsourcecode.getelementsbyclassname("table-row")
  11. '***網頁的編碼**********************************
  12. '<div class="table-row">   為所要的資料 的網頁元素
  13. '<span class="t2 table-cell">期別</span>
  14. '<span class="t2 table-cell">2020</span>
  15. '<span class="t2 table-cell">2019</span>
  16. '<span class="t2 table-cell">2018</span>
  17. '<span class="t2 table-cell">2017</span>
  18. '<span class="t2 table-cell">2016</span>
  19. '<span class="t2 table-cell">2015</span>
  20. '<span class="t2 table-cell">2014</span>
  21. '<span class="t2 table-cell">2013</span>
  22. '</div>************************************
  23. For i = 0 To TableG.Length - 1
  24.     For j = 0 To TableG(i).all.tags("span").Length - 1
  25.        Cells(i + 1, j + 1) = TableG(i).all.tags("span")(j).innertext
  26.     Next j
  27. Next i
  28. End With
  29. Set HTMLsourcecode = Nothing '釋放記憶體
  30. Set GetXml = Nothing
  31. End Sub '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
複製代碼
請教 版大 我 office 2007 版 測試 程式
Set TableG = HTMLsourcecode.getelementsbyclassname("table-row")
這行會誤,是否版本的問題
謝謝 版大

Image 7.jpg (95.22 KB)

Image 7.jpg

TOP

回復 15# GBKEE


    謝謝 娰主 程式 , 學習中 。

googs.jpg (210.53 KB)

googs.jpg

TOP

回復 14# GBKEE


    謝謝 版主  從 中學到很多。

TOP

        靜思自在 : 做好事不能少我一人,做壞事不能多我一人。
返回列表 上一主題