How can I get an element of web page to display in

2019-07-14 09:07发布

How can I get a specific element of a determined webpage to display it in excel WebBrowser as example like <img> or <iframe> or <audio> or <a> ... etc.

I know how to display an image if it is not a part of webpage like the following.

WebBrowser1.Navigate "about:blank"
WebBrowser1.Document.Write "<img style=""width:100%;"" src=""http://www.sthua.edu.sg/images/vba-logo.jpg"">"

but I don't know how to get an element by id or class name from any webpage.

1条回答
不美不萌又怎样
2楼-- · 2019-07-14 09:40

Here is an example showing how to retrieve class="gt-baf-table" element from the webpage translate.google.com.eg, and put it into WebBrowser1 control on the UserForm1:

Option Explicit

Sub Test()

    Dim objIE As Object
    Dim objNode As Object
    Dim objTable As Object
    Dim strHtmlContent As String
    Dim colSSheets As Object
    Dim objSSContent As Object
    Dim varSSheet
    Dim objWB As Object
    Dim objHead As Object
    Dim varCssNumber

    ' instantiate IE, navigate and get target DOM element
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True ' for debug only
    objIE.Navigate "https://translate.google.com.eg/?hl=ar&tab=wT#en/ar/boy"
    Wait objIE
    WaitElementById objIE, "gt-lc"
    ' retrieve HTML content
    Set objNode = objIE.Document.GetElementById("gt-lc")
    Set objTable = objNode.GetElementsByClassName("gt-baf-table")(0)
    strHtmlContent = objTable.outerHTML
    strHtmlContent = "<body dir=rtl>" & strHtmlContent & "</body>"
    ' retrieve CSS content
    Set colSSheets = objIE.Document.styleSheets
    Set objSSContent = CreateObject("Scripting.Dictionary")
    For Each varSSheet In colSSheets
        objSSContent(objSSContent.Count) = varSSheet.cssText
    Next
    objIE.Quit
    ' Init UserForm, WebBrowser
    UserForm1.Show
    Set objWB = UserForm1.WebBrowser1
    objWB.Navigate "about:blank"
    Wait objWB
    ' put HTML and CSS content into WebBrowser
    With objWB.Document
        .Write strHtmlContent
        Set objHead = .GetElementsByTagName("head")(0)
        For Each varCssNumber In objSSContent
            objHead.appendChild .createElement("style")
            .styleSheets(.styleSheets.Length - 1).cssText = objSSContent(varCssNumber)
        Next
    End With

End Sub

Sub Wait(objIE)
    Do While objIE.ReadyState < 4 Or objIE.Busy
        DoEvents
    Loop
    Do Until objIE.Document.ReadyState = "complete"
        DoEvents
    Loop
End Sub

Sub WaitElementById(objIE, strId)
    Do While IsNull(objIE.Document.GetElementById(strId))
        DoEvents
    Loop
End Sub

The resulting output on the UserForm1 is as follows:

UserForm1

And the same fragment rendered in Chrome:

Chrome

查看更多
登录 后发表回答