2016-10-27 13 views
1

Excel 2013 Windows 7で。XPath/Javascript/jQueryは範囲外です。VBA/DOM - 属性に基づいて要素を取得

選択divの要素、つまり特定の属性を持つ要素を反復しようとしています。

私の現在のアプローチはsimilar to thisですが、属性に基づいて要素を選択する非手動方法は見つかりませんでした。私はそれが(unelegant場合)実行可能であると確信している間だけ、私は起動時にループがなってしまうために起こっているどのように大きなためならば、次善のようだ、このソリューション

With CreateObject("WINHTTP.WinHTTPRequest.5.1") 
    .Open "GET", url, False 
    .Send 
    pHTML.body.innerHTML = .ResponseText 
End With 

Set eCollection = pHTML.getElementsByClassName("chapter").getElementsByTagName("div") 

For i = 0 To eCollection.Length 
    If eCollection(i).getAttribute("data-level") >= 0 Then ' Throw cake 
Next i 

:私が来た最も近いのようなものでした特定の要素および要素のシーケンスをの中で探します。これらの要素はです。

だから私はこのような何かを行う方法を探しています:

For Each pElement In pHTML.getElementsByClassName("chapter").getElementsByTagName("div").getElementsByAttribute("data-level") 
    ' Throw cake at the element 
Next 

私はので、何の方法getElementsByAttribute、問題がないことを承知しています。
ここで私は盲目的なアプローチがありますか、手動の反復にロックされていますか?私はIEのインスタンスを作成するための私の現在のアプローチを交換する場合

また、ア・ラ・this answer、私はconcievably私は上記の概説している結果に似た何かで終わるためにquerySelectorAllを使用することができますか?いわば

この方法来る他の誰のために
+2

querySelectorAllが機能するはずです。代わりに、ExecScriptの使用とjqueryステートメントの使用を検討することもできます。この回答のようなもの:http://stackoverflow.com/questions/9032618/find-elements-attribute-value私はjqueryを使用して、トリッキーな要素を見つける必要があるときにこれを行うきれいな方法を見つけました。 –

+0

私はJS/jQueryをあまりコードしませんが、 'querySelector'を動作させることができないかどうかを知る必要があります。入力いただきありがとうございます。 – Vegard

答えて

2

、外殻は、次のようになります。

Function getElementsByAttribute(pObj As Object, domAttribute As String, domAttributeValue As String) As Object() 
    Dim oTemp() As Object 
    ReDim oTemp(1 To 1) 

    For i = 0 To pObj.Length - 1 
     'Debug.Print pObj(i).getAttribute(domAttribute) 
     If pObj(i).getAttribute(domAttribute) = domAttributeValue Then 
      Set oTemp(UBound(oTemp)) = pObj(i) 
      ReDim Preserve oTemp(1 To UBound(oTemp) + 1) 
     End If 
    Next i 

    ReDim Preserve oTemp(1 To UBound(oTemp) - 1) 

    getElementsByAttribute = oTemp 
End Function 
:あなたはこのルートを行けば

Sub ScrapeWithHTMLObj(url As String, domClassName As String, domTag As String, domAttribute As String, domAttributeValue As String) 
    ' Dependencies: 
    ' * Microsoft HTML Object Library 

    ' Declare vars 
    Dim pHTML As HTMLDocument 
    Dim pElements As Object, pElement As Object 

    Set pHTML = New HTMLDocument 

    ' Basic URL healthcheck 
    Do While (url = "" Or (Left(url, 7) <> "http://" And Left(url, 8) <> "https://")) 
     MsgBox ("Invalid URL!") 
     url = InputBox("Enter new URL: (0 to terminate)") 
     If url = "0" Then Exit Sub 
    Loop 

    ' Fetch page at URL 
    With CreateObject("WINHTTP.WinHTTPRequest.5.1") 
     .Open "GET", url, False 
     .Send 
     pHTML.body.innerHTML = .ResponseText 
    End With 

    ' Declare page elements 
    Set pElements = pHTML.getElementsByClassName(domClassName) 
    Set pElement = pElements(0).getElementsByTagName(domTag) 

    ' Extract only elements with wanted attribute 
    pEleArray = getElementsByAttribute(pElement, domAttribute, domAttributeValue) 

    For Each e In pEleArray 
     ' Do stuff to elements 
     Debug.Print e.getAttribute(domAttribute) 
    Next 
End Sub 

を、あなたはこのような何かをも必要となります

HTMLツリーに応じて、サブ要素内のどの要素を明示的に変更するかを変更する必要があります。私がテストで使ったサイトでは、この構造は完璧に機能しました。

使用例:
Call ScrapeWithHTMLObj("https://somesite", "chapter-index", "div", "data-level", "1")

それは、chapter-indexという名前の最初のクラスを入力divタグを持つすべての要素を選択し、最後に値1を持つ属性data-levelを含むすべての要素を抽出します。

関連する問題