Zum Inhalt springen

HTML-Seite nach Links dursuchen


NV_GeFreak

Empfohlene Beiträge

Hallo allerseits. Ich bin neu sowohl hier im Forum, als auch im VB. Ich hatte etwas Programmier-Erfahrung mit Delphi (Schule und Freizeit). Nun wollte ich es mit VB probieren. Ich arbeite mit Microsoft Visual Studio 2008. Mein Programm ist ein Browser mit ein Paar erweiterten Funktionen. Eins davon soll folgendes erledigen:

Aktuelle HTML-Seite (vom WebBrowser1) nach Links dursuchen und diese dann in einer ListBox (oder noch besser in einer ListView) anzeigen/ausgeben.

Ich habe zwar beim Googeln das hier gefunden, aber schon an der Stelle mit "InStr" kommt diese Fehler meldung:

"Error 2 Overload resolution failed because no accessible 'InStr' can be called without a narrowing conversion:

'Public Function InStr(Start As Integer, String1 As String, String2 As String, [Compare As Microsoft.VisualBasic.CompareMethod = Microsoft.VisualBasic.CompareMethod.Binary]) As Integer': Argument matching parameter 'Start' narrows from 'Long' to 'Integer'.

'Public Function InStr(String1 As String, String2 As String, [Compare As Microsoft.VisualBasic.CompareMethod = Microsoft.VisualBasic.CompareMethod.Binary]) As Integer': Argument matching parameter 'String1' narrows from 'Long' to 'String'.

'Public Function InStr(String1 As String, String2 As String, [Compare As Microsoft.VisualBasic.CompareMethod = Microsoft.VisualBasic.CompareMethod.Binary]) As Integer': Argument matching parameter 'Compare' narrows from 'String' to 'Microsoft.VisualBasic.CompareMethod'. C:\Users\BLA\Documents\Visual Studio 2008\Projects\WindowsApplication1\WindowsApplication1\Form1.vb 124 24 WindowsApplication1

"

Und davon ca. 10 Stück. Was mache ich falsch? Vielleicht habe ich vergessen etwas zu deklarieren oder so?

Hier mein Code:

Public Class Form1



    Private Sub ToolStripButton8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton8.Click

        WebBrowser1.Navigate(ComboBox1.Text)

    End Sub


    Private Sub WebBrowser1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserProgressChangedEventArgs) Handles WebBrowser1.ProgressChanged

        ToolStripStatusLabel2.Text = WebBrowser1.StatusText

        ToolStripProgressBar1.Visible = True


        Dim p, d, t As Integer


        d = e.CurrentProgress


        t = e.MaximumProgress


        If d <= 0 Then


            ToolStripProgressBar1.Value = 0


            ToolStripProgressBar1.Visible = False


        Else


            ToolStripProgressBar1.Value = Math.Min(ToolStripProgressBar1.Maximum, Convert.ToInt32(Math.Floor(ToolStripProgressBar1.Maximum * (d / t))))


        End If



    End Sub


    Private Sub ToolStripButton1_ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.ButtonClick

        WebBrowser1.GoBack()

    End Sub


    Private Sub ToolStripButton2_ButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.ButtonClick

        WebBrowser1.GoForward()

    End Sub


    ' Disables the Forward button at the end of navigation history.

    Private Sub webBrowser1_CanGoForwardChanged( _

        ByVal sender As Object, ByVal e As EventArgs)



        ToolStripButton2.Enabled = WebBrowser1.CanGoForward


    End Sub

    ' Disables the Back button at the beginning of the navigation history.

    Private Sub webBrowser1_CanGoBackChanged( _

        ByVal sender As Object, ByVal e As EventArgs)



        ToolStripButton1.Enabled = WebBrowser1.CanGoBack



    End Sub


    ' Disables the Back button at the beginning of the navigation history.

    Private Sub webBrowser1_IsBusy( _

        ByVal sender As Object, ByVal e As EventArgs)


        ToolStripButton5.Enabled = WebBrowser1.IsBusy


    End Sub




    Private Sub ToolStripButton6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton6.Click

        WebBrowser1.Refresh()

    End Sub


    Private Sub ToolStripButton5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton5.Click

        WebBrowser1.Stop()

    End Sub


    Private Sub ToolStripButton3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton3.Click

        WebBrowser1.GoHome()

    End Sub


    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        TabPage1.Text = WebBrowser1.DocumentTitle



    End Sub


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        ' TabPage1.Text.

    End Sub


    Private Sub SpeichernUnterToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SpeichernUnterToolStripMenuItem.Click

        If FolderBrowserDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then


            ' Set the FolderChoiceTextBox's Text to theFolderBrowserDialog's


            '    SelectedPath property.


            '  Me.FolderChoiceTextBox.Text = theFolderBrowser.SelectedPath


        End If



    End Sub

    Private Function HTML_GetAllURLs( _

  ByVal sHTMLText As String) As Object


        ' Alle URL-Adressen im übergebenen HTML-Text suchen

        ' und als Array zurückgeben


        Dim sPos As Long

        Dim ePos As Long

        Dim hPos As Integer

        Dim nCount As Long

        Dim sTemp As String

        Dim sLink As String

        Dim sURL() As String


        nCount = 0

        If sHTMLText <> "" Then

            ' an erster Position begonnen

            sPos = 1

            Do

                ' nach einleitendem Link-Tag suchen "<a"

                sPos = InStr(sPos, LCase$(sHTMLText), "<a ")


                If sPos > 0 Then

                    ' <a - Tag gefunden, jetzt End-Tag suchen

                    ePos = InStr(sPos, sHTMLText, ">")

                    If ePos > 0 Then


                        ' End-Tag gefunden

                        ' jetzt alles zwischen sPos und ePos filtern

                        sTemp = Mid$(sHTMLText, sPos, ePos - sPos)

                        If InStr(Mid$(sTemp, 2), "<") = 0 Then

                            ' nur wenn < nicht nochmals vorhanden ist

                            sTemp = Mid$(sTemp, 4)


                            ' jetzt nach dem Schlüsselwort "HREF" suchen

                            hPos = InStr(LCase$(sTemp), "href=")

                            If hPos > 0 Then

                                ' gefunden... jetzt die Link-Adresse auslesen

                                sLink = Mid$(sTemp, hPos + 5)

                                ' Prüfen, ob "-Zeichen vorhanden,

                                ' wenn ja - "ausschneiden"

                                If Left$(sLink, 1) = Chr$(34) Then

                                    sLink = Mid$(sLink, 2)

                                    sLink = strLeft(sLink, Chr$(34))

                                Else

                                    sLink = strLeft(sLink, " ")

                                End If

                                If Right$(sLink, 1) = Chr$(34) Then _

                                  sLink = Left$(sLink, Len(sLink) - 1)


                                ' Link in URL-Array speichern

                                ReDim Preserve sURL(nCount)

                                sURL(nCount) = sLink

                                nCount = nCount + 1


                                ' Weitersuche ab "ePos"

                                sPos = ePos - 1

                            End If

                        End If

                    End If

                    sPos = sPos + 1

                Else

                    Exit Do

                End If

            Loop

        End If


        HTML_GetAllURLs = sURL

    End Function




End Class

Edit 1

Sorry, der Thread gehört natürlich in die Kategorie "C++: Compiler, IDEs, APIs ". Zu spät gesehen ...

Bearbeitet von NV_GeFreak
Link zu diesem Kommentar
Auf anderen Seiten teilen

OK, habe ein Paar Variablen-Typen geändert.

    Private Function HTML_GetAllURLs( _

  ByVal sHTMLText As String) As Object


        ' Alle URL-Adressen im übergebenen HTML-Text suchen

        ' und als Array zurückgeben


        Dim sPos As Integer

        Dim ePos As Integer

        Dim hPos As Integer

        Dim nCount As Integer

        Dim sTemp As String

        Dim sLink As String

        Dim sURL() As String

        Dim strLeft As String


        nCount = 0

        If sHTMLText <> "" Then

            ' an erster Position begonnen

            sPos = 1

            Do

                ' nach einleitendem Link-Tag suchen "<a"

                sPos = InStr(sPos, LCase$(sHTMLText), "<a ")


                If sPos > 0 Then

                    ' <a - Tag gefunden, jetzt End-Tag suchen

                    ePos = InStr(sPos, sHTMLText, ">")

                    If ePos > 0 Then


                        ' End-Tag gefunden

                        ' jetzt alles zwischen sPos und ePos filtern

                        sTemp = Mid$(sHTMLText, sPos, ePos - sPos)

                        If InStr(Mid$(sTemp, 2), "<") = 0 Then

                            ' nur wenn < nicht nochmals vorhanden ist

                            sTemp = Mid$(sTemp, 4)


                            ' jetzt nach dem Schlüsselwort "HREF" suchen

                            hPos = InStr(LCase$(sTemp), "href=")

                            If hPos > 0 Then

                                ' gefunden... jetzt die Link-Adresse auslesen

                                sLink = Mid$(sTemp, hPos + 5)

                                ' Prüfen, ob "-Zeichen vorhanden,

                                ' wenn ja - "ausschneiden"

                                If Left$(sLink, 1) = Chr$(34) Then

                                    sLink = Mid$(sLink, 2)

                                    sLink = strLeft(sLink, Chr$(34))

                                Else

                                    sLink = strLeft(sLink, " ")

                                End If

                                If Right$(sLink, 1) = Chr$(34) Then _

                                  sLink = Left$(sLink, Len(sLink) - 1)


                                ' Link in URL-Array speichern

                                ReDim Preserve sURL(nCount)

                                sURL(nCount) = sLink

                                nCount = nCount + 1


                                ' Weitersuche ab "ePos"

                                sPos = ePos - 1

                            End If

                        End If

                    End If

                    sPos = sPos + 1

                Else

                    Exit Do

                End If

            Loop

        End If


        HTML_GetAllURLs = sURL

    End Function

Jetzt habe ich nur noch Problem mit "Left$" - Fehler:

"Error 3 'Public Property Left() As Integer' has no parameters and its return type cannot be indexed."

Das Gleiche mit "Right$". Und "Chr$(34)" sagt mir:

"Error 4 Type character '$' does not match declared data type 'Integer'."

Und halt noch n Paar andere Kleinigkeiten (

Error 5 Type character '$' does not match declared data type 'Char'.

Error 6 Too many arguments to 'Public ReadOnly Default Property Chars(index As Integer) As Char'.

Error 7 Type character '$' does not match declared data type 'Char'.

Error 8 Too many arguments to 'Public ReadOnly Default Property Chars(index As Integer) As Char'.

Error 9 'Public ReadOnly Property Right() As Integer' has no parameters and its return type cannot be indexed.

Error 10 Type character '$' does not match declared data type 'Integer'.

Error 11 Type character '$' does not match declared data type 'Char'.

Error 12 'Public Property Left() As Integer' has no parameters and its return type cannot be indexed.

Error 13 Type character '$' does not match declared data type 'Integer'.

)

Ideen was da Falsch ist?

Bearbeitet von NV_GeFreak
Link zu diesem Kommentar
Auf anderen Seiten teilen

kann es sein, dass du einfach den quelltext aus klassischem VB hergenommen hast und in VB.NET umwandeln wolltest? da ist ziemlich viel VB6-müll drinnen im source.

im übrigen würde ich entweder das projekt wegwerfen und von grund neu auf schreiben (dann hast du auch die basics) oder das ganze stark abmagern.

und das HTML_GetAllURLs würde ich so aufsetzen, dass du nicht den vollständigen HTML-quelltext selbst parst (das ist unsauber, fehleranfällig und du erfindest zudem das rad neu), sondern einfach den DOM-baum des dokuments durchgehst.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm...

Also wie ich schon sagte, bin ich neu auf diesem Gebiet. Und wie mir deine Antwort gezeigt hat (völlig zurecht), habe ich nur einen blassen Schimmer von dem was ich da gerade tuhe. Vielleicht hätte ich als Anfänger mit den Basics anfangen sollen. Es ist schon peinlich genug zu sagen, dass ich nicht einmal genau weiss, wie die Sprache von Visual Studio heisst (VB oder VB.NET). Ich werde erst mal einen "Google Crash-Kurs" machen und mir die Grundlagen anschauen.

Dennnoch wäre ich wirklich dankbar, wenn jemand von euch Profis mir den Code posten könnte, wie man diese Funtion umsetzen kann:

Aktuelle HTML-Seite (vom WebBrowser1) nach Links dursuchen und diese dann in einer ListBox (oder noch besser in einer ListView) anzeigen/ausgeben./QUOTE]
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde zur Lösung folgende Ansätze präferieren:

  1. falls es sich um ein valides XTML Dokument handelt, würde ich das XHTML mit einer XSLT in ein eigenes XML Dokument umwandeln, in dem nur die gewünschten Linkdaten enthalten sind. Dieses XML via DOM einfach auslesen und darstellen.
  2. falls es um ein valides HTML Dokument geht, kann man dies entweder nach XHTML umwandeln und via XSLT verarbeiten bzw wie Amstelchen beschrieben hat, das DOM verarbeiten
  3. bei nicht vaildem Code würde ich die Daten via RegExpr zu lesen

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja. Warum so kompliziert? :D Ich habs jetzt so gemacht:

    Public Function Find(ByVal quellcode As String)

        Dim QC As String

        Dim sPos As Integer

        Dim ePos As Integer


        QC = quellcode

        ListBox1.Items.Clear()


        Do

            sPos = InStr(ePos + 1, QC, "http://")

            If sPos > 0 Then

                ePos = InStr(sPos + 1, QC, ">")

                If ePos > 0 Then

                    ListBox1.Items.Add(Mid$(QC, sPos + 0, ePos - sPos - 1))

                End If

            End If

        Loop Until sPos = 0 Or ePos = 0


    End Function
Dann noch die JPEGs Filtern:
    Private Sub List()


        Dim SP As Integer

        Dim EP As Integer

        ListBox2.Items.Clear()

        For i = 0 To ListBox1.Items.Count - 1

            Do


                SP = InStr(EP + 1, ListBox1.Items.Item(i), "http://")

                If SP > 0 Then

                    EP = InStr(SP + 1, ListBox1.Items.Item(i), ".jpg")

                    If EP > 0 Then


                        ListBox2.Items.Add(Mid$(ListBox1.Items.Item(i), SP + 0, EP - SP - 1))


                    End If

                End If

            Loop Until SP = 0 Or EP = 0

        Next



    End Sub
Aufruf:
    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted

        TabPage1.Text = WebBrowser1.DocumentTitle

        Call Find(WebBrowser1.Document.Body.InnerHtml)

        Call List()


    End Sub
Nun habe ich folgendes Problem :upps - Die Items aus der Listbox2 in die ListView1 zu bringen. Mit dem hier
    Private Sub List2()

        For i = 0 To ListBox2.Items.Count - 1


            Do

                ListView1.Items.Add(ListBox2.Items.Item(i))

            Loop Until i = ListBox2.Items.Count - 1


        Next


    End Sub

klappt das auch aber:

a) Nur wenn die ListBox2 NUR EINEN Eintrag hat (wenn mehr -> Endlosschleife) und

B) In die Group "Default" - ich will sie aber ALLE in die Group "Bilder" (Index 0) haben. Bzw. wenn es Bilder sind (also ".jpg") -> Group(0)

Videos (".avi") -> Group(1) usw.

Vorschläge?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habs:

    Private Sub List2()

        For i = 0 To ListBox2.Items.Count - 1

            'Fügt ein Item in die LV1 in die erste Group aus der LB2 an der Stelle i mit dem ImageIndex 3

            ListView1.Items.Add(ListBox2.Items.Item(i), 3).Group = ListView1.Groups(0)

        Next

    End Sub

Die Endlosscheife kam von "Do - Loop Until"

Was bei MSDN so alles drin steht :)

Tja, das wars soweit. Bis zum nächsten Problem, Ciao :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...