Lấy dữ liệu từ Internet, Đối tượng HTMLDocument không hoạt động với các phương thức getElement

Liên hệ QC

khongnhienttt

Thành viên hoạt động
Tham gia
15/7/15
Bài viết
137
Được thích
33
Nhờ ACE chỉ dẫn giúp cách sử dụng đối tượng HTMLDocument (CreateObject("HTMLFile")), trong bài toán về việc lấy dữ liệu từ internet, nếu ta dùng InternetExplorer hoặc Selenium thì khi khởi động trình duyệt rất chậm, vì vậy mình dùng XMLHTTP60 (CreateObject("MSXML2.XMLHTTP")), dùng XMLHTTP60 thì mình có thể lấy được source của trang web và từ đó tách chuỗi để lấy nội dung, nhưng làm như thế rất thủ công nên mình add source đó vào HTMLDocument để tận dụng các phương thức getElementById, getElementByClass, getElementBytagName lấy chính xác nội dung cần lấy, tuy nhiên lỗi xảy ra là khi debug code bên dưới trong Immediate windows
1. khi mình gõ: ?http.responseText thì nó hiện toàn bộ source của trang web
2. Nhưng khi mình gán html.body.innerHTML = http.responseText, và mình gõ ?html.body.innerHTML thì lại ra 1 dòng trống
3. và code báo lỗi ngay dòng: Set elem = html.getElementsByClassName("ctr-p") ' Do không tìm thấy phương thức getElementsByClassName trong đối tượng HTMLDocument
Nhờ ACE giúp đỡ, mình cám ơn rất nhiều.
Mã:
Sub google()

    Const url = "https://www.google.co.in"
    Set http = CreateObject("MSXML2.XMLHTTP")
    Set html = CreateObject("HTMLFile")

    http.Open "GET", url, False
    http.Send
    html.body.innerHTML = http.responseText

    Dim elem As Object
    Set elem = html.getElementsByClassName("ctr-p")               ' HTMLElementCollection
    Debug.Print elem.Length
    Set elem = html.getElementsByClassName("ctr-p")("viewport")   ' HTMLDivElement  <div class="ctr-p" id="viewport">
    Debug.Print elem.Children.Length

    Dim aaa As Object
    Set aaa = elem.getElementsByTagName("div")("hplogo")          ' HTMLDivElement
    Debug.Print aaa.Children.Length
    Debug.Print aaa.outerHTML

End Sub
 
Chưa chắc đã là Microsoft XML version 6.0
em nghĩ phần code về CreateObject("MSXML2.XMLHTTP") sẽ không có vấn đề gì đâu ạ, vì trước giờ e vẫn dùng code của thầy Tuấn (ndu96081631) để tải file, và tải html của web về bình thường ạ, như code bên dưới, cái lỗi là không biết dùng CreateObject("HTMLFile")
Mã:
Function DownloadJSON(ByVal sURL As String) As String
  With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", sURL, False
    .send
    DownloadJSON = .responseText
  End With
End Function
Mã:
Private Sub URL2File(ByVal URL As String, ByVal Folder2Save As String)
  Dim objReq As Object
  Dim FileName As String, path As String
  If Right(Folder2Save, 1) <> "\" Then Folder2Save = Folder2Save & "\"
  FileName = Mid(URL, InStrRev(URL, "/") + 1, Len(URL))
  path = Folder2Save & FileName
  Set objReq = CreateObject("MSXML2.XMLHTTP")
  objReq.Open "GET", URL, False
  objReq.send
  If objReq.Status = 200 Then
    With CreateObject("ADODB.Stream")
      .Open
      .Type = 1
      .Write objReq.ResponseBody
      .Position = 0
      .SaveToFile path, 2
      .Close
    End With
  End If
  Set objReq = Nothing
End Sub
 
Upvote 0
2. Nhưng khi mình gán html.body.innerHTML = http.responseText, và mình gõ ?html.body.innerHTML thì lại ra 1 dòng trống
Thêm code dưới sau dòng HTML.body.innerHTML = http.responseText
Mã:
    Open "d:\hichic.txt" For Binary As #1
    Put #1, , HTML.body.innerHTML
    Close #1
    Exit Sub
-> chạy code -> kiểm tra tập tin "d:\hichic.txt" sẽ thấy không rỗng.
3. và code báo lỗi ngay dòng: Set elem = html.getElementsByClassName("ctr-p") ' Do không tìm thấy phương thức getElementsByClassName trong đối tượng HTMLDocument
Nếu tôi nhớ không nhầm thì IE (ít nhất là từ IE8 trở về trước) không bao giờ phục vụ getElementsByClassName. Tức interface IHTMLDocument3, IHTMLElement đều không có phương thức getElementsByClassName.

Dùng các phương thức và thuộc tính mà IE phục vụ thôi.
 
Upvote 0
Réo cái ả ô-tô-ri-p-lai vào diễn cho. Ả này siêng ba cái mớ nét niếc lắm.
Có lẽ thớt kém may mắn. Ả này dạo sau ít thấy vào.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom