Bild-URL per RegEx auslesen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von yakubutsu.

    Bild-URL per RegEx auslesen

    Hallo,

    ich möchte auf basis von Dodo's tutorial hier -> [VB 2008] Etwas aus dem HTML Quelltext auslesen mit HTTPWebRequest & RegEx
    mein programm dazu bringen eine Bild-URL aus einer Website zu kopieren.

    die URL sieht beispielsweise folgendermaßen aus:

    Quellcode

    1. <img src="http://ia.media-imdb.com/images/M/MV5BMjIyODA2NDg4NV5BMl5BanBnXkFtZTcwMjg4NDAwMw@@._V1._SX214_CR0,0,214,314_.jpg" alt="Salt Poster" title="Salt Poster" height="314" width="214">


    ich habe es mit merheren beispielen probiert. derzeit sieht es bei mir so aus

    Quellcode

    1. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://www.imdb.com/title/tt0944835/")
    2. Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
    3. Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
    4. Dim httpContent As String = reader.ReadToEnd
    5. Dim rx As New Regex("<img(.*)src=""(?<url>([a-zA-Z0-9.:-_/]+))""(.*)>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    6. Dim rxMatches As MatchCollection = rx.Matches(TextBox1.Text)
    7. For Each oMatch As Match In rxMatches
    8. ListBox1.Items.Add(oMatch.Groups("url").ToString())
    9. Next
    10. End Sub


    optimal wäre natürlich, wenn er nur bilder rausliest deren width genau 214 ist.

    leider kenne ich mich mit RegEx nicht besonders gut aus. Die MSDN dokumentation war nicht sehr aufschlussreich und das tutorial unter codeproject.com/KB/dotnet/regextutorial.aspx konnte mir nicht erklären, wie ich genau vorgehe um bilder auszulesen.

    Ich hoffe ihr könnt mir Tipps geben oder mich auf aufschlussreiche beispielprojekte verweisen.
    In Deiner Menge a-zA-Z0-9.:-_/]+ fehlen ein paar Zeichen (z.B.@), weiterhin werden Regex-spezifische Zeichen nicht mit einem \ escaped. Mach es Dir doch einfacher und nimm alles bis zum nächsten Anführungszeichen.

    Noch ein paar Kleinigkeiten
    - es muss nur in Klammern gesetzt werden was Du wirklich in einer Gruppe auslesen möchtest
    - nimm die RegexOption.Singleline dazu, wenn Du die Folge .* benutzt: dann deckt der Punkt auch Zeilenvorschübe ab
    - nimm nie .* sondern .*? als lazy Operator, sonst nimmt er den grössten Block den er finden kann (google "gieriges Regex")

    Mal ein Bespielcode mit 2 Pattern, pattern1 entspricht Deinem und pattern2 sucht nach Bildern mit Weite 214:

    VB.NET-Quellcode

    1. Dim httpContent As String = "<img src=""http://ia.media-imdb.com/images/M/MV5BMjIyODA2NDg4NV5BMl5BanBnXkFtZTcwMjg4NDAwMw@@._V1._SX214_CR0,0,214,314_.jpg"" alt=""Salt Poster"" title=""Salt Poster"" height=""314"" width=""214"">"
    2. Dim pattern1 As String = "<img.*?src=""(?<url>.*?)"""
    3. Dim pattern2 As String = "<img.*?src=""(?<url>.*?)""[^>]*?width=""214"">"
    4. For Each m As Match In Regex.Matches(httpContent, pattern1, RegexOptions.Singleline Or RegexOptions.IgnoreCase)
    5. MessageBox.Show(m.Groups("url").ToString())
    6. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kangaroo“ ()

    hallo,
    vielen dank für deine antowrt.

    dein codebeispiel funktioniert schinmal 100 mal besser als meins und das mit den 2 pattern ist auch cool. leider konnte ich es nicht mit pattern 2 zum laufen bringen, er gibt dann keinen wert aus, obwohl ein image sicher einen width von 214 auf der seite hat, die ausgelesen wird
    (siehe quellausschnitt im ersten post.)

    mir ist beim durchlesen des patterns kein fehler aufgefallen. ich bin aber auch nicht grade geübt mit dem verstehen von regex patterns.


    ich hab dein codebeispiel mal auf meinen code übertragen:

    VB.NET-Quellcode

    1. Private Sub btn_getcover_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_getcover.Click
    2. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://www.imdb.com/title/tt0944835/")
    3. Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
    4. Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
    5. Dim httpContent As String = reader.ReadToEnd
    6. 'Dim httpContent As String = "<img src=""http://ia.media-imdb.com/images/M/MV5BMjIyODA2NDg4NV5BMl5BanBnXkFtZTcwMjg4NDAwMw@@._V1._SX214_CR0,0,214,314_.jpg"" alt=""Salt Poster"" title=""Salt Poster"" height=""314"" width=""214"">"
    7. Dim pattern1 As String = "<img.*?src=""(?<url>.*?)"""
    8. Dim pattern2 As String = "<img.*?src=""(?<url>.*?)""[^>]*?width=""214"">"
    9. For Each m As Match In Regex.Matches(httpContent, pattern2, RegexOptions.Singleline Or RegexOptions.IgnoreCase)
    10. MessageBox.Show(m.Groups("url").ToString())
    11. Next
    12. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „yakubutsu“ ()

    yakubutsu schrieb:

    leider konnte ich es nicht mit pattern 2 zum laufen bringen, er gibt dann keinen wert aus, obwohl ein image sicher einen width von 214 auf der seite hat, die ausgelesen wird

    Ich weiss nicht welche URL Du auslesen möchtest, es sucht halt nach width="214" im image-Tag. Mit dem String den Du angegeben hattest funktioniert es jedefalls.

    Allerdings bin ich auch weit entfernt vom Regex-Profi, aber wenn man es mal halbwegs kann möchte man es auch nicht mehr missen.

    Nachtrag: nimm mal in pattern2 die letzte eckige Klammer (>) weg ...

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

    Das width Attribute kann im Image-Tag vor oder nach dem Source-Attribute stehen, also wirst Du es wohl leider in 2 Stufen auslesen müssen:
    - erst alle Image-Tags ermittleln
    - danach Source und wenn vorhanden die Width ermitteln

    Das kann z.B. so aussehen:

    VB.NET-Quellcode

    1. ' alle image elemente lesen
    2. Dim patternList As String = "<img([^>]*)>"
    3. For Each listMatch As Match In Regex.Matches(httpContent, patternList, RegexOptions.Singleline Or RegexOptions.IgnoreCase)
    4. ' source auslesen
    5. Dim src As String = Regex.Match(listMatch.Groups(1).Value, "src\s*=\s*""(?<url>.+?)""").Groups("url").Value
    6. ' width uslesen
    7. Dim widthS As String = Regex.Match(listMatch.Groups(1).Value, "width\s*=\s*""(?<width>.+?)""").Groups("width").Value
    8. ' und zu integer konvertieren
    9. Dim width As Integer = 0
    10. Integer.TryParse(widthS, width)
    11. ' ausgabe
    12. Trace.WriteLine("width=" & width & " src=" & src)
    13. Next
    super erklärt. vielen dank.

    wenn ich das richtig verstehe, kann ich ja dann einfach mit einem befehl die url die eine width von 214 hatte mit
    [...]
    if width = 214 then
    msgbox(src)
    end if
    next
    [...]
    rausfiltern. super genial. danke... jetzt muss ich nurnoch hoffen, dass jemand noch so ein paar tipps in [VB 2010] Java-Webformular mit der Webbrowser-Klasse ausfüllen. für mich erübrigen kann. dann bin ich mit meinem projekt einen riesenschritt weiter :)

    danke danke nochmal.