2017-07-29 10 views
0

Ich bin relativ neu in der Programmierung und habe einen Web-Scraper in VBA geschrieben, die ich versuche, es in VB.Net auf Visual Studio neu zu erstellen. Ich verwende das gleiche Objekt (mshtml.HTMLDocument), das ich in vba verwendet habe, aber aus irgendeinem Grund scheint es im Visual Studio die .getElementsByClassName-Methode zu fehlen, die für mein Programm essentiell ist. Ich verstehe einfach nicht, warum es in VB.net auf Visual Studio fehlen würde, wenn ich dieselbe Referenzbibliothek und dasselbe Objekt verwende, das ich beim Erstellen in VBA verwendet habe.HTMLDocument Objekt fehlende Methoden in Visual Studio

Gibt es etwas, was ich falsch mache?

VBA Intellisense & Reference Library

Visual Studio VB.Net Intellisense, Reference Library, & Error

+0

@ TnTinMin Ich sehe IHMTLDocument6 oder 7 als Option nicht in Visual Studio. Es scheint nur zu IHTMLDocument5 zu gehen. Wenn ich es jedoch in VBA anschaue, zeigt es IHMTLDocument6 und IHMTLDocument7. – Devan382

+0

Hast du gelesen, ** verstanden ** und die Antwort implementiert, auf die ich hingewiesen habe? Sie müssen eine Interop-Assembly basierend auf der Typbibliothek für die aktuelle Version von MsHtml erstellen, die auf Ihrem Computer installiert ist, und dann auf diese Interop-Bibliothek verweisen. nicht der im GAC. – TnTinMn

+0

Entschuldigung, ich habe missverstanden, was du zuerst gesagt hast. Ich habe gerade getan, was es in dem Link gesagt hat und es funktioniert jetzt. Vielen Dank! – Devan382

Antwort

0

A System.Windows.Forms.HtmlDocument (in VB.NET) kein mshtml.HtmlDocument (in VBA). Ohne den relevanten Code zu sehen, kann ich nicht sicher sein, dass Sie nicht mit dem ersteren gelandet sind.

Anstatt zusätzliche Schritte zu durchlaufen, um letzteres zu erhalten, können Sie Ihre eigene Methode zum Abrufen von Elementen mit einem bestimmten Klassennamen schreiben, z.

Public Class Form1 

    Dim wb As WebBrowser 

    Function GetElementsHavingClassName(doc As HtmlDocument, className As String) As List(Of HtmlElement) 
     Dim elems As New List(Of HtmlElement) 

     For Each elem As HtmlElement In doc.All 
      Dim classes = elem.GetAttribute("className") 
      If classes.Split(" "c).Any(Function(c) c = className) Then 
       elems.Add(elem) 
      End If 
     Next 

     Return elems 

    End Function 

    Sub ExtractElements(sender As Object, e As WebBrowserDocumentCompletedEventArgs) 
     Dim wb = DirectCast(sender, WebBrowser) 
     Dim flintstones = GetElementsHavingClassName(wb.Document, "flintstone") 

     If flintstones.Count > 0 Then 
      For Each fs In flintstones 
       ' do something with the element 
       TextBox1.AppendText(fs.InnerText & vbCrLf) 
      Next 
     Else 
      TextBox1.Text = "Not found." 
     End If 

    End Sub 

    Sub DoStuff() 
     If wb Is Nothing Then 
      wb = New WebBrowser 
     End If 

     RemoveHandler wb.DocumentCompleted, AddressOf ExtractElements ' don't leave any old ones lying around 
     AddHandler wb.DocumentCompleted, AddressOf ExtractElements 

     Dim loc = "file:///c:\temp\somehtml.html" 

     Try 
      wb.Navigate(loc) 
     Catch ex As Exception 
      'TODO: handle the problem gracefully. 
      MsgBox(ex.Message) 
     End Try 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     DoStuff() 

    End Sub 

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing 
     If wb IsNot Nothing Then 
      RemoveHandler wb.DocumentCompleted, AddressOf ExtractElements 
      wb.Dispose() 
     End If 

    End Sub 

End Class 

Welche angesichts der HTML

<!DOCTYPE html> 
<html> 
<head><title></title></head> 
<body> 
<div class="fred flintstone">Fred</div> 
<div class="wilma flintstone">Wilma</div> 
<div class="not-a-flintstone">Barney</div> 
</body> 
</html> 

Ausgänge

Fred
Wilma

+0

Ich habe es mit Dim HtmlDoc als New mshtml.HTMLDocument deklariert, das ist das gleiche wie ich es im VBA-Code deklariert habe und sie beide verwenden die gleiche Bibliothek. Würde die benutzerdefinierte Funktion auch nicht langsamer sein? – Devan382

+0

@ Devan382 Das von TnTinMn vorgeschlagene Duplikat scheint zu erklären, was zu tun ist, wenn Sie keine andere Wahl haben, aber beachten Sie, dass es eine fragile Lösung sein wird. Die benutzerdefinierte Methode wird nicht unbedingt langsamer sein - und es gibt wahrscheinlich andere Teile des Programms, die mehr als nur ersetzt werden können. Zum Beispiel benötigen Sie möglicherweise nicht einmal einen Browser, um die Seite mit der gesamten benötigten Zeit zu rendern und stattdessen [HtmlAgilityPack] (https://www.nuget.org/packages/HtmlAgilityPack) zu verwenden. Ich schlage jedoch vor, dass Sie es zuerst funktionieren und dann sehen, ob Verbesserungen tatsächlich benötigt werden;) –

+0

Ich habe gerade untersucht, was TntinMin vorgeschlagen hat und ich sehe IHMTLDocument6 oder 7 nicht als eine Option in Visual Studio. Es scheint nur zu IHTMLDocument5 zu gehen. Wenn ich es jedoch in VBA anschaue, zeigt es IHMTLDocument6 und IHMTLDocument7. – Devan382

Verwandte Themen