Board logo

標題: [發問] 網頁抓取資料如何讓中文完整顯示(用CreateObject系列) [打印本頁]

作者: PKKO    時間: 2018-11-12 11:17     標題: 網頁抓取資料如何讓中文完整顯示(用CreateObject系列)

使用以下程式碼當網頁有中文的時候
例如[漲、跌]等字樣會變成亂碼
如何用CreateObject系列的方式來讓中文正確顯示呢?
嘗試用.setRequestHeader "charset", "utf-8"等方法約莫七八種都無效
有大大有經驗嗎?
  1. Sub TEST()
  2. Url = "http://mops.twse.com.tw/nas/t21/sii/t21sc03_107_4_0.html"
  3. Set HTML = CreateObject("Microsoft.XMLHTTP")
  4. With HTML
  5.     .Open "GET", Url, False
  6.     .setRequestHeader "pragma", "no-cache"
  7.     .setRequestHeader "cache-control", "no-store, must-revalidate, private"
  8.     .setRequestHeader "charset", "utf-8"
  9.     .send
  10. End With
  11. MsgBox HTML.responseText
  12. End Sub
複製代碼

作者: ciboybj    時間: 2018-11-12 13:26

給點意見
你的網站是big5 編碼
所以解析的時候應該是要用 big5去解析
msgbox是用哪種編碼顯示可能要查一下
如果msgbox不是big5編碼 也會有亂碼的狀況
作者: quickfixer    時間: 2018-11-12 21:49

本帖最後由 quickfixer 於 2018-11-12 21:51 編輯

01那邊抄來的解法:lol

Sub TEST()
Url = "http://mops.twse.com.tw/nas/t21/sii/t21sc03_107_4_0.html"
Set HTML = CreateObject("Microsoft.XMLHTTP")
With HTML
    .Open "GET", Url, False
    .setRequestHeader "pragma", "no-cache"
    .setRequestHeader "cache-control", "no-store, must-revalidate, private"
    .setRequestHeader "charset", "utf-8"
    .send
End With
MsgBox convertraw(HTML.responsebody)
End Sub


Function convertraw(rawdata)

    Dim rawstr
    Set rawstr = CreateObject("adodb.stream")
    With rawstr
        .Type = 1
        .Mode = 3
        .Open
        .Write rawdata
        .Position = 0
        .Type = 2
        .Charset = "big5"
        convertraw = .ReadText
        .Close
    End With
    Set rawstr = Nothing

End Function
作者: PKKO    時間: 2018-11-12 22:51

回復 2# ciboybj


msgbox 只是展示給大大們看
我實際是直接讀取內容
但讀取內容也是亂碼

想問有辦法轉為正確的中文嗎?
作者: PKKO    時間: 2018-11-12 22:51

回復 3# quickfixer


    感謝,我明天測試一下!!!
作者: PKKO    時間: 2018-11-13 22:32

回復 3# quickfixer


    好強大的方式阿....完全正確速度又快
大大好會搜尋
我查國外網站都找不到
只有一個方式可以用,但速度太慢
您的這個方式好厲害!!!

大大說的01指的是mobile1嗎?
下次我也去那邊找找看答案
作者: GBKEE    時間: 2018-11-14 16:07

回復 6# PKKO
試試看
  1. Option Explicit
  2. Sub Ex_中文亂碼_GET()
  3.   Dim strText As String
  4.   Dim I As Integer, j As Integer, xTable As Object
  5.   With CreateObject("msxml2.xmlhttp")
  6.     .Open "GET", "http://mops.twse.com.tw/nas/t21/sii/t21sc03_107_4_0.html", False
  7.     .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  8.     .send
  9.     strText = BinToStr(.responseBody, "BIG5") '要注意網頁編碼
  10.   End With
  11.   With CreateObject("htmlfile")
  12.         .Write strText
  13.         Set xTable = .all.tags("table")(2)
  14.         With ActiveSheet
  15.             .Cells.Clear
  16.             For I = 0 To xTable.Rows.Length - 1
  17.                 For j = 0 To xTable.Rows(I).Cells.Length - 1
  18.                     .Cells(I + 1, j + 1) = xTable.Rows(I).Cells(j).innertext
  19.                 Next
  20.             Next
  21.         End With
  22.   End With
  23. End Sub
  24. Function BinToStr(arrBin, strChrs)
  25.     With CreateObject("ADODB.Stream")
  26.         .Type = 2
  27.         .Open
  28.         .Writetext arrBin
  29.         .Position = 0
  30.         .Charset = strChrs
  31.         BinToStr = .ReadText
  32.         .Close
  33.     End With
  34. End Function
複製代碼

作者: PKKO    時間: 2019-1-4 10:28

回復 7# GBKEE


非常感謝超版大大
原本以為三樓已經可以解決我的問題
沒想到會產生出其他問題

使用您的程式碼則完全沒有其他問題
真是太強大了,再次感謝!!!




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)