Auslesen eines Strings und filtern (URLs)

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von xtts02.

    Falls das Steuerelement WebBrowser verwendet wird

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. With DirectCast(sender, WebBrowser)
    3. For Each link As HtmlElement In .Document.Links
    4. Debug.WriteLine(link.GetAttribute("href"))
    5. Next
    6. End With
    7. End Sub


    Falls Quelltext als String -> RegEx (wie bereits erwähnt)

    whory schrieb:

    Wie sieht das dann mit Regex aus? Das ist ja ne Kunst für sich, habe ich alles schon durchgelesen

    Regex ist an und für sich her einfach, schwierig sind eigentlich nu die richtigen Suchstrings (Pattern) zu finden.

    In dem Code hier siehst Du beide Möglichkeiten die Links zu ermitteln, per WebBrowser.Links Eigenschaft und als andere Möglichkeit Regex.

    Code Beispiel

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Dim wb As New WebBrowser
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. ' navigieren
    6. wb.Navigate("www.focus.de")
    7. ' navigieren abwarten
    8. While wb.ReadyState <> WebBrowserReadyState.Complete
    9. Application.DoEvents()
    10. End While
    11. ' alle links des HTML-Documents ausgeben
    12. For Each link As HtmlElement In wb.Document.Links
    13. ' Trace.WriteLine("->" & link.GetAttribute("href"))
    14. Next
    15. ' oder per Regex aus dem String auslesen
    16. Dim quelltext As String = wb.Document.Body.InnerHtml
    17. Dim pattern As String = "href=""http://(?<link>[^""]+)"
    18. ' alle matches ermitteln und ausgeben
    19. For Each m In Regex.Matches(quelltext, pattern)
    20. Trace.WriteLine(m.groups("link").value)
    21. Next
    22. End Sub
    23. End Class



    Nicht erfasst werden allerdings in der Seite vorhandene lokale Links, die ja nicht mit http:// anfangen
    wo werden die matches dann ausgegeben? weil eigentlich sind das viel zu viele links, ist auch eine dynamische webseite und verändert sich jede stunde, die benötigten links bleiben jedoch an ihrer stelle, sie verändern sich nur.

    hätte die ganzen matches gerne als variablen

    link1 =
    link2 =

    usw

    VB.NET-Quellcode

    1. Dim allLinks As New List (Of String)
    2. For Each link As HtmlElement In Webbrowser.Document.Links
    3. allLinks.Add (link.GetAttribute("href"))
    4. Next

    Aufrufen kannst du es dann so:

    VB.NET-Quellcode

    1. allLinks.Item (index As Integer)

    TheoTechnic schrieb:

    VB.NET-Quellcode

    1. Dim allLinks As New List (Of String)
    2. For Each link As HtmlElement In Webbrowser.Document.Links
    3. allLinks.Add (link.GetAttribute("href"))
    4. Next

    Aufrufen kannst du es dann so:

    VB.NET-Quellcode

    1. allLinks.Item (index As Integer)


    Beim ausführen kommt:

    Eine Ausnahme (erste Chance) des Typs "System.NullReferenceException" ist in *r.exe aufgetreten.

    edit: allLinks.Item (index As Integer) ... also kann ich dann txt_ausgabe = allLinks.Item(1) für den ersten Link nehmen?

    TheoTechnic schrieb:

    Hast du eine neue Distanz vom Namen Webbrowser1 von der Klasse Webbrowser erzeugt?


    KP??

    Wieso bekomme ich keine Msgbox?

    VB.NET-Quellcode

    1. ' navigieren
    2. wb.Navigate("http://link.de")
    3. ' navigieren abwarten
    4. While wb.ReadyState <> WebBrowserReadyState.Complete
    5. Application.DoEvents()
    6. End While
    7. ' alle links des HTML-Documents ausgeben
    8. For Each link As HtmlElement In wb.Document.Links
    9. ' Trace.WriteLine("->" & link.GetAttribute("href"))
    10. Next
    11. ' oder per Regex aus dem String auslesen
    12. Dim quelltext As String = wb.Document.Body.InnerHtml
    13. Dim pattern As String = "href=""http://(?<link>[^""]+)"
    14. ' alle matches ermitteln und ausgeben
    15. For Each m In Regex.Matches(quelltext, pattern)
    16. Trace.WriteLine(m.groups("link").value)
    17. Next
    18. Dim allLinks As New List(Of String)
    19. For Each link As HtmlElement In WebBrowser1.Document.Links
    20. allLinks.Add(link.GetAttribute("href"))
    21. Next
    22. Dim currentstring As String = allLinks.Item(12)
    23. ' If currentstring <> allLinks.Item(12) Then
    24. MsgBox(currentstring)
    25. 'End If


    Also was stimmt daran nicht?
    Aber das kommt nie zuende, es kriege keine MsgBox mit dem Link...

    edit: das ist in einen timer, falls ihr nicht checkt wieso ich am ende überprüfe, ob der 12. link immer noch der gleich link ist.. :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „whory“ ()