Etwas aus dem HTML Quelltext auslesen mit HTTPWebRequest & RegEx

    • VB.NET

    Es gibt 130 Antworten in diesem Thema. Der letzte Beitrag () ist von Stephan.eXe.

      Etwas aus dem HTML Quelltext auslesen mit HTTPWebRequest & RegEx

      Da ja immer wieder gefragt wird, wie man etwas aus einem Quelltext rausließt, habe ich hier mal ein kleines Beispiel gemacht.
      Zum einen nutze ich den HTTPWebRequest, welcher besser geeignet ist als das WebBrowser Control und statt bei einer bestimmten Zeichenkette zu Splitten nutze ich hier die deutlich professionelleren Regular Expressions. Leider wird ja bisher noch nicht auf allen Seiten der W3C Standard angewendet, denn würde dies der Fall sein, könnte man viel mehr Informationen einfach auslesen, wenn DIV Container IDs haben.

      Bei meinem Beispiel nutze ich folgende PHP Datei:

      PHP-Quellcode

      1. <html>
      2. <head>
      3. <title>VB-Testseite</title>
      4. </head>
      5. <body>
      6. <div id="myip"><?=$_SERVER['REMOTE_ADDR']?></div>
      7. <div id="sqlcollection">Fred;Bochum;32,Alex;Berlin;21,Jeanine;Hamburg;16</div>
      8. </body>
      9. </html>


      Und hier der VB-Code:

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Imports System.Text.RegularExpressions
      4. Public Class Form1
      5. Dim peoples() As String
      6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      7. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://server.de/test.php")
      8. Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
      9. Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
      10. Dim httpContent As String = reader.ReadToEnd
      11. txtSourcecode.Text = httpContent
      12. Dim ipRegEx As New Regex("\<div id=\""myip\""\>(?<string>(.*))\<\/div\>")
      13. Dim myIP As String = ipRegEx.Match(httpContent).Groups("string").ToString()
      14. lblIP.Text = "Deine IP: " & myIP
      15. Dim peopleRegEx As New Regex("\<div id=\""sqlcollection\""\>(?<string>(.*))\<\/div\>")
      16. Dim sqlcollection As String = peopleRegEx.Match(httpContent).Groups("string").ToString()
      17. peoples = sqlcollection.Split(",")
      18. For Each sqlLine In peoples
      19. Dim sqlCells() As String = sqlLine.Split(";")
      20. lstPeoples.Items.Add(sqlCells(0))
      21. Next
      22. End Sub
      23. Private Sub lstPeoples_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstPeoples.SelectedIndexChanged
      24. Dim sqlCells() As String = peoples(lstPeoples.SelectedIndex).Split(";")
      25. lblPeopleInfo.Text = "Wohnort: " & sqlCells(1) & vbNewLine & "Alter: " & sqlCells(2)
      26. End Sub
      27. End Class


      Kleine Info zu den RegEx Pattern:
      Mit (?<name>(pattern)) kann man einen Gruppennamen festlegen, wobei name durch etwas beliebiges, eindeutig identifizierbares ersetzt werden kann. Ich habe die Gruppe "string" genannt und später beim Match sieht man ja das ich via .Group("string") dann auf eben diese Gruppe wieder zugreife. Dies ist vorallem von vorteil, wenn man im RegEx Pattern mehrere Infos haben möchte, z.B.:
      Von <div id="test" class="außen">inhalt</div> möchte ich nun den KlassenNamen und Inhalt bekommen, also würde mein PatternString folgendermaßen aussehen: "\<div id=\""test\"" class=\""(?<class>(.*))\""\>(?<string>(.*))\<\/div\>"
      nun kann habe ich in .Group("class") den KlassenNamen und in .Group("string") den Inhalt im DIV Container.

      Das (.*) in den Pattern bedeutet lediglich akzeptiere alle möglichen Zeichen, keine oder mehrere. Dazu guckt man am besten in die MSDN Referenz , dort stehen alles, was man zur Erzeugung der Pattern benötigt.
      Bei der IP könnte der PatternString z.B. auch folgendermaßen aussehen, da eine IP nur aus Zahlen und Punkten besteht
      "\<div id=\""myip\""\>(?<string>([0-9.]*))\<\/div\>", heißt also es dürfen die Zahlen 0-9 enthalten sein und Punkte.

      Edit: Hier ist noch ein Beispielprojekt
      Download (71kb)

      Edit:
      Hier noch eine super Seite, wo man sich Pattern OPTISCH zusammen stückeln kann txt2re.com/


      Edit (03.05.2010):
      Da ich nun immer häufiger gelesen habe, das einige etwas auslesen möchten, wo die Pattern öfters zutreffen, habe ich mal ein wenig experimentiert und nun kann ich mit einem kleinen einfachen Code in meinem Beispiel z.B. alle URLs der IMG-Tags von einem HTML Dokument auslesen.

      HTML-Quellcode

      1. <html>
      2. <head>
      3. <title>Hallo</title>
      4. </head>
      5. <body>
      6. <img src="test.png" width="100" />
      7. <img border="0" src="bild.png" />
      8. <img src="http://www.server.de/bild.png" width="100" />
      9. <img src="vb.png" width="100" />
      10. <img src="foo.png" width="100" />
      11. </body>
      12. </html>


      VB.NET-Quellcode

      1. Imports System
      2. Imports System.Text.RegularExpressions
      3. Public Class Form1
      4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      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
      11. End Class


      Wie man sieht total simpel. Sollten in der URL noch andere Zeichen vorkommen so müssten sie im Pattern nachgetragen werden, man sollte hier jedoch nicht (.*) eingeben, da ansonsten alles zwischen dem ersten und letzten Anführungszeichen ausgegeben wird, also bei dem Text

      HTML-Quellcode

      1. <img src="vb.png" width="100" />


      würde in der Listbox

      Quellcode

      1. vb.png" width="100


      angezeigt werden.

      Edit: Hier noch ein gutes Tutorial codeproject.com/KB/dotnet/regextutorial.aspx

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Dodo“ ()

      Habe mal eine kleine Frage hierzu:
      Der Quelltext lautet:

      Quellcode

      1. <div id="myip"> das was ich haben will </div>


      Daraus wird dann:

      VB.NET-Quellcode

      1. Dim ipRegEx As New Regex("\<div id=\""myip\""\>(?<string>(.*))\<\/div\>")

      Ich frage mich wo diese ganzen / und \ und " herkommen.
      Also <div id="myip"> steht vorne und </div> steht hinten und in der Mitte der String eben.
      Aber wieso wird aus

      Quellcode

      1. <div id="myip">
      das:

      Quellcode

      1. \<div id=\""myip\""\> ??


      Warum kann ich nicht sagen:

      VB.NET-Quellcode

      1. Dim ipRegEx As New Regex("<div id="myip">(?<string>(.*))</div>")
      Weil zum einen " zu dem gesamten String gehört, wenn du aber innerhalb dieses String wieder Anführungszeichen verwenden willst geht das ja nicht einfach so, weil wie schon gesagt, damit würde VB denken der String ist dort zu ende

      Bsp.: FALSCH

      VB.NET-Quellcode

      1. MsgBox("hier ein zeichen " und text geht weiter")
      -> Wird VB mäckern

      Bsp.: Richtig

      VB.NET-Quellcode

      1. MsgBox("hier ein zeichen "" und text geht weiter")
      -> Messagebox mit hier ein zeichen " und der text geht weiter

      Zu den \ die sind nötig um die spnderzeichen zu Escapen. Da diese Zeichen bestimmte bedeutungen in RegEx haben, muss der ja wissen, hierbei handelt es sich um den String und nich um eine Funktion die ich jetzt nutzen soll.

      Lese dazu de.wikipedia.org/wiki/Maskierungszeichen
      Ich krieg es einfach nicht hin :(
      Ich möchte aus einem Quelltext das auslesen:

      Brainfuck-Quellcode

      1. .............   <div id="onAir" style="width:420px;overflow:hidden;"><strong><a href="/member/2281" target="_top"><span style="color:#ffdd82">deforceDRX</span></a><span style="color:#dfb649"> mit "Afterwork Dance" (HandsUp)</span></strong></div>.............

      Und an einer anderen Stelle:

      Brainfuck-Quellcode

      1. ....................
      2. <div style="width:345px;float:left; margin-top:11px; overflow:hidden"> Brisby & Jingles feat. Miloud - Who'll Stop The Rain </div> <div style="width:40px;float:left; margin-top:11px; overflow:hidden"><a href="/tracklist.php"><span style="color:#DFB649"><strong>Tracks</strong></span></a></div> </div>.....................

      HP ist Technobase.fm..
      Ich habe wirklich viel probiert aber es will nichts klappen....
      Diese beiden dinge will ich dann halt in einem Label wiedergeben.
      moin :),

      hab ein problem mit der RegEx "structur".. ich möcht gern

      Quellcode

      1. <div class="blub" id="blub" style="display: block;">string</div>


      den string auslesen komme aber nicht klar mit den ganzen zeichen vom RegEx (/ \ "" (?string usw.. )

      könnt mir da jemand helfen? :thumbsup:

      edit : wäre es so richtig ?

      VB.NET-Quellcode

      1. "\<div class=\""blub\"" id=\""blub\"" style=\""display\: block\;\""\>(?<string>(.*))\<\/div\>"

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

      @Dodo: das ist schön, aber was macht wenn ich von x bilibiegen Browser eine Seite den Quelltext auslesen will. Dein Beispiel basiert sich auf Browser Element und NET Framework Classen. Mit Hilfe von WIN API paar Zeilen in Code lässt sich von x bilibiegen Browser den Seiten Quelltext auslesen ! :thumbup:

      EDIT: Man kann deine Code erweitern in dem man die URL Adresse eines Browsers ausliest !

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

      Hey Alex2000,
      du hast das ein wenig falsch verstanden.
      Wenn jemand den Quelltext von einer Seite auf seiner Festplatte gespeichert hat,
      und z.B. das src-Attribut eines img-Elements auslesen will, kann er diesen Code benutzen.

      MfG,
      -haiyyu
      Hey,
      nein, hast du nicht ^^
      Also, du kannst bei jedem (gängigen) Browser den Quelltext einer Seite speichern.
      Nun kannst du z.B. Attributen mit diesem Code auslesen.
      Das hat nichts mit dem Browser zu tun ;)

      MfG,
      -haiyyu
      Hey,

      VB.NET-Quellcode

      1. Imports System.Net
      2. Imports System.IO
      3. Imports System.Text.RegularExpressions
      4. Public Class Form1
      5. Dim peoples() As String
      6. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      7. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://dnp.zir-con.de/_test/vb-test.php")
      8. Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
      9. Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
      10. Dim httpContent As String = reader.ReadToEnd
      11. txtSourcecode.Text = httpContent
      12. Dim ipRegEx As New Regex("\<div id=\""myip\""\>(?<string>(.*))\<\/div\>")
      13. Dim myIP As String = ipRegEx.Match(httpContent).Groups("string").ToString()
      14. lblIP.Text = "Deine IP: " & myIP
      15. Dim peopleRegEx As New Regex("\<div id=\""sqlcollection\""\>(?<string>(.*))\<\/div\>")
      16. Dim sqlcollection As String = peopleRegEx.Match(httpContent).Groups("string").ToString()
      17. peoples = sqlcollection.Split(",")
      18. For Each sqlLine In peoples
      19. Dim sqlCells() As String = sqlLine.Split(";")
      20. lstPeoples.Items.Add(sqlCells(0))
      21. Next
      22. End Sub
      23. Private Sub lstPeoples_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstPeoples.SelectedIndexChanged
      24. Dim sqlCells() As String = peoples(lstPeoples.SelectedIndex).Split(";")
      25. lblPeopleInfo.Text = "Wohnort: " & sqlCells(1) & vbNewLine & "Alter: " & sqlCells(2)
      26. End Sub
      27. End Class
      hat Dodo auch schon gepostet.

      MfG,
      -haiyyu
      Also ich bekomme es immernoch nicht hin.

      Habe diesen HTML Code:

      Quellcode

      1. userid=123">XXXX</a><img src="

      Dieses XXXX in der Mitte möchte ich gerne als String haben.
      Aber wie muss ich diese Klammern setzen?

      Ich bekomme immer den Fehler "Falsche Escape-Zeichensetzung"

      Könnte mir netterweise jemand den Code geben? :love:
      Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed
      Also es kommt schonmal keine Fehlermeldung mehr.
      Aber dafür ist der String leer.
      Also es steht nix drin.

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

      Nabend

      Also mal meine Frage(n):

      Kann ich den Reader so einstellen das nur eine bestimme Zeile ließt?
      Ich hab ein HTML-Dokument das mehrere 100 Zeilen hat, und was dazu kommt
      Das was ich haben will ist locker 10-x vorhanden


      Quellcode

      1. <td align="center" class='header' width="90"><font >636</font></td>


      Das 636 möchte haben (Zeile 88), aber leide gibt die gleichen Blocks (Nur mit anderen Werten), wie schon gesagt, mehrmals




      Ist das möglich?
      Du nimmst einfach ein Pattern was auf jede dieser Zeilen matcht. Am Ende einfach nur auf die Collection (oder Array oder was auch immer bei mehreren Treffern zurückgegeben wird) am Index i zugreifen. Deine bestimmte Zeile muss natürlich immer an der gleichen Stelle in der Collection (...) sein.
      Ich weis jetzt warum es bei nicht klappt

      Er kann den Quelltext nicht richtig anzeigen, weil ich ein Proxy an habe :D




      Kann man das mit eingeschalteten Proxy lesen? :P

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SAR-71“ ()

      hallo, ich hätt da mal eine frage...

      ich habe mir das hier ja mal angeschaut und möcht ja mehr lernen, nun bastelte ich ja schon rum, und hatte das hier gemacht... nix weltbewegendes, is ja schon hier 2 ma gepostet worden

      VB.NET-Quellcode

      1. Dim RegEx01 As New Regex("\<div id=\""nr\""\>(?<string>(.*))\<\/div\>")
      2. Dim nr As String = RegEx01.Match(httpContent).Groups("string").ToString()


      Sooooooo nun meine frage, die div Box ist ja dynamisch, das bedeutet, die ID der div ändert sich der reihe nach mit zahlen, also nr1, nr2 und so weida... wie geb ich das hier an dass er jenachdem wieviel einträge sichtbar sind auch die ID´s dazu schreibt zur divid?