Links auslesen Regex..

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Epic.

    Links auslesen Regex..

    Hey Leute,
    Ich habe eine Funktion im Internet gefunden um links aus HTML Seiten auzulesen, das ist diese:

    VB.NET-Quellcode

    1. Public Function FindHrefs(ByVal inputString As String) As List(Of String)
    2. Dim r As Regex
    3. Dim m As Match
    4. Dim regString As String = _
    5. "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"
    6. r = New Regex(regString, _
    7. RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    8. m = r.Match(inputString)
    9. Dim bla As New List(Of String)
    10. While m.Success
    11. If m.Groups(1).Value.StartsWith("http") Or m.Groups(1).Value.StartsWith("www.") Then
    12. bla.Add(m.Groups(1).Value)
    13. End If
    14. m = m.NextMatch()
    15. End While
    16. Return bla
    17. End Function


    Sollte auch alles gut funktionieren, aber wenn ich z.b The Coderz nehme Zeigt er mir nur Folgende Links an:

    VB.NET-Quellcode

    1. http://the-coderz.de
    2. http://the-coderz.de/Board
    3. http://the-coderz.de/Board/?coderzStyleType=2
    4. http://the-coderz.de/Board/userlogin.html
    5. http://the-coderz.de/Board/index.php?page=Register
    6. http://the-coderz.de/Board/index.php?form=Search&amp;action=unread
    7. http://the-coderz.de/Board/index.php?form=Search&amp;action=unreplied
    8. http://the-coderz.de/Board/index.php?form=Search&amp;action=24h
    9. http://the-coderz.de/Board/index.php?form=Search
    10. http://the-coderz.de/Board/index.php?form=Search
    11. http://the-coderz.de/Board/index.php?page=Index


    So hab ich die Funktion verwendet:

    VB.NET-Quellcode

    1. For Each bla In FindHrefs(qlltxt)
    2. If bla.EndsWith(".css") Or bla.EndsWith(".ico") Or bla.EndsWith(".jpg") Or bla.EndsWith(".png") Or bla.EndsWith(".gif") Or bla.EndsWith(".exe") Then
    3. GoTo 10
    4. End If
    5. ' Anfang IF
    6. If bla.EndsWith("/") Then
    7. bla = bla.Remove(bla.Length - 1, 1)
    8. End If
    9. ' Ende if
    10. ' Anfang if
    11. If bla.Contains("www.") Or bla.Contains("http://") Then
    12. bla = bla.Replace("www.", Nothing)
    13. If Not bla.Contains("http://") Then
    14. bla = "http://" & bla
    15. End If
    16. Else
    17. GoTo 10
    18. End If
    19. ' Ende if
    20. ' Anfang schleife
    21. For Each blu In File.ReadAllText(sburls).Split(vbCrLf)
    22. If blu = bla Then
    23. vorhanden = True
    24. End If
    25. Next
    26. ' Ende schleife
    27. ' anfang if
    28. If vorhanden = False Then
    29. ' Hier füge ich die URLS Hinzu
    30. End If
    31. ' ende if
    32. 10:
    33. Next


    Jetzt wollte ich wissen wo der Fehler liegt bzw. ob jemand eine bessere Methode kennt (besser Funktion) um Links auszulesen. (Kein Webbrowser).
    Freue mich über Antworten
    Mfg
    Confix
    Das ist für deinen Super-Webbot, oder?

    Wenn die eine Funktion schon funktioniert, was macht dann die andere?
    Mehr Infos bitte.

    'edit:
    Ok, die scheint wohl zum sortieren da zu sein.
    Ich würde die etwas abändern (und sauberer machen)

    Wie wärs damit:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim qlltxt As String = New Net.WebClient().DownloadString("http://www.youtube.com/")
    3. Dim sburls As String = "C:\urls.txt"
    4. Dim endungen As String() = {".css", ".ico", ".jpg", ".png", ".gif", ".exe"}
    5. For Each currenturl In FindHrefs(qlltxt)
    6. Dim vorhanden As Boolean = False
    7. Dim jumpover As Boolean = False
    8. For Each endung As String In endungen
    9. If currenturl.EndsWith(endung) Then
    10. jumpover = True
    11. Exit For
    12. End If
    13. Next
    14. If jumpover = True Then
    15. Continue For
    16. End If
    17. If currenturl.EndsWith("/") Then
    18. currenturl = currenturl.Remove(currenturl.Length - 1, 1)
    19. End If
    20. If currenturl.Contains("www.") Or currenturl.Contains("http://") Then
    21. currenturl = currenturl.Replace("www.", String.Empty)
    22. If currenturl.StartsWith("http://") = False Then
    23. currenturl = "http://" & currenturl
    24. End If
    25. Else
    26. Continue For
    27. End If
    28. Dim strreader As New IO.StreamReader(sburls)
    29. Dim txtcontent() As String = strreader.ReadToEnd.Split(vbCrLf)
    30. strreader.Dispose()
    31. strreader.Close()
    32. For Each dateilinie In txtcontent
    33. If dateilinie = currenturl Then
    34. vorhanden = True
    35. Exit For
    36. End If
    37. Next
    38. If vorhanden = False Then
    39. Console.WriteLine(currenturl)
    40. Dim str As New IO.StreamWriter(sburls)
    41. str.WriteLine(currenturl)
    42. Else
    43. Continue For
    44. End If
    45. Next
    46. Console.ReadLine()
    47. End Sub
    48. Public Function FindHrefs(ByVal inputString As String) As List(Of String)
    49. Dim r As Regex
    50. Dim m As Match
    51. Dim regString As String = _
    52. "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"
    53. r = New Regex(regString, _
    54. RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    55. m = r.Match(inputString)
    56. Dim bla As New List(Of String)
    57. While m.Success
    58. If m.Groups(1).Value.StartsWith("http") Or m.Groups(1).Value.StartsWith("www.") Then
    59. bla.Add(m.Groups(1).Value)
    60. End If
    61. m = m.NextMatch()
    62. End While
    63. Return bla
    64. End Function

    [nicht getestet]
    Was habe ich gemacht?
    Den Code sauberer gemacht (Labels und Gotos ausgetauscht)

    lass mich doch mal editieren. Da haste deinen Webbot. Ist aber noch nicht fertig. Wenn du willst kann ich dir ja mal die Source zu meinem geben, den ich auch nie fertig gemacht habe. xD

    'edit2:

    VB.NET-Quellcode

    1. Ich weiß nicht genau welche von den beiden funktionen die Fehler machen.
    Was für ein Fehler denn?
    Von meinem iPhone gesendet

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

    Ich frag mich echt langsam ob du eigentlich lesen kannst, habe ich geschrieben dass das Programm fertig ist oder ich noch dran arbeite? Außerdem ist dass Offtopic was du da redest.
    Ich weiß nicht genau welche von den beiden funktionen die Fehler machen.


    Edit:
    Kein Fehler, er zeigt nur alle urls nicht an.

    Habs jetzt so geändert dass er alle anzeigt siehe hier:

    VB.NET-Quellcode

    1. Public Function FindHrefs(ByVal inputString As String) As List(Of String)
    2. Dim r As Regex
    3. Dim m As Match
    4. Dim regString As String = _
    5. "href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>\S+))"
    6. r = New Regex(regString, _
    7. RegexOptions.IgnoreCase Or RegexOptions.Compiled)
    8. m = r.Match(inputString)
    9. Dim bla As New List(Of String)
    10. While m.Success
    11. If Not m.Groups(1).Value.EndsWith(".css") And Not m.Groups(1).Value.EndsWith(".ico") And Not m.Groups(1).Value.EndsWith(".jpg") And Not m.Groups(1).Value.EndsWith(".png") And Not m.Groups(1).Value.EndsWith(".exe") And m.Groups(1).Value.StartsWith("http") Or m.Groups(1).Value.StartsWith("www.") Then
    12. For Each bläx In allurls
    13. If bläx = m.Groups(1).Value Then
    14. vorhanden = True
    15. End If
    16. Next
    17. If vorhanden = False Then
    18. bla.Add(m.Groups(1).Value)
    19. Else
    20. vorhanden = False
    21. End If
    22. End If
    23. m = m.NextMatch()
    24. End While
    25. Return bla
    26. End Function

    Ich hab allurls (list of string) hinzugefügt wo alle urls drin stehen die durchgegangen sind.
    Jetzt sollte er das Prüfen (macht er nicht) wieso, gute frage^^
    Und Aufruf:

    VB.NET-Quellcode

    1. ' Anfang IF
    2. If bla.EndsWith("/") Then
    3. bla = bla.Remove(bla.Length - 1, 1)
    4. End If
    5. bla = bla.Replace("www.", Nothing)
    6. If Not bla.Contains("http://") Then
    7. bla = "http://" & bla
    8. End If
    9. ' Ende if
    10. ' Anfang schleife
    11. For Each blu In allurls
    12. If blu = bla Then
    13. vorhanden = True
    14. End If
    15. Next
    16. ' Ende schleife
    17. ' anfang if
    18. If vorhanden = False Then
    19. allurls.add(bla)
    20. SubURLS.Add(bla)
    21. ListBox1.Items.Add(bla)
    22. File.AppendAllText(sburls, vbNewLine & bla)
    23. subitem = vbNewLine & bla & " wurde gerade hinzugefügt!"
    24. Label2.Text = "Liest gerade " & addressen & " aus!" & vbNewLine & subitem
    25. durchsucht += 1
    26. Label1.Text = durchsucht
    27. End If
    28. ' ende if
    29. 10:
    30. vorhanden = False

    Was ich vergessen war natürlich mal wieder schlau von mir -.- vorhanden = false am ende vergessen (sonst ist es ja immer vorhanden d.h keine neuen Kommen dazu).
    Aber jetzt sind auch doppelte Vorhanden.


    @nikeee13
    joa ich werde mal schauen wie ich die beiden Codes jetzt zusammenbekomme.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Load-soft.ch.vu“ ()

    Ich hab mal schnell nen mimi-bot zusammengebastelt. (ist nur ein Bot mit Einstellbaren maximalen Threads. Nicht zu hoch stellen, sonst entsteht enorm viel Traffic.) Ich habe deine Findhrefs-Funktion einfach reingebastelt.
    Der Bot ist nicht wirklich sauber programmiert und weist noch Fehler und Performanceprobleme auf.
    Da: ul.to/e6f3vh

    Ist nur ein Anfang. Es gibt noch Probleme mit Doppelten Links.

    Bitte die Kommentare über den Imports beachten.
    Von meinem iPhone gesendet
    Mhh ja deins klappt eigentlich perfekt bis auf dass wenn zwei threads offen sind nicht beide auf die txt zugreifen können aber das lässt sich vlt auch nicht ändern, also ich habe dass ganze ja in einer Endlosschleife (Do Loop Schleife) der zeigt mir aber an:
    Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.
    Ich gehe ja mit schleife die List of String durch aber diese wird nur außerhalb der for - next anweisung benutzt.
    Wie kann dass sein?
    Erwähnen tuhe ich dich trotztdem ^^