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.

      Hallo markus-obi
      Danke für die schnelle Hilfe. Problem ist nur das dim str as string ="<option selected=""selected"" value=" und genau hier ist das jedesmal anders. Das ist das erste Problem das zweite Problem ist das es es jetzt vorkommen kann das die gesuchte 2 stellige Zahl 4 mal da sein kann. Z.B. wenn das Datum Juni und der der Tag der 6. ist dann würde da stehen 2012060606 ich möchte dann aber nur immer die letzten 2 zahlen auslesen. Wenn ich nun nach 06 suche wie findet man dann die richtige 06 ?
      Sorry aber vieleicht bin ich auch zu dumm. Ich werde mir mal das Regex Tutorial ausdrucken und durchlesen.

      VB.NET-Quellcode

      1. Dim str As String = "<option selected=""selected"" value=""2012040406""> 06Z 04 April 2012 </options"
      2. Debug.WriteLine(Regex.Match(str, "(?<=<option selected=""selected"" value=""\d*)\d{2}(?="")"))


      In der Variable str ist natürlich der gesamte Quelltext.
      Dieser Code schreibt dir die letzten beiden Zahlen der Zahl 2012040406 aus der 2.Zeile auf die Konsole. Das wolltest du doch oder?
      Der Code funktioniert für jedes Datum, also auch wenn sich die Länge ändert: Zum Beispiel im Jahr 10000 ;)
      Problem ist nur das dim str as string ="<option selected=""selected"" value=" und genau hier ist das jedesmal anders

      Du sagst die entsprechende Zeile fängt nicht immer mit <option selected="selected" value=" an?
      Woher soll ich das wissen? Du musst schon die Kriterien formulieren, welche Zeile genommen werden soll. Wenn du das nicht machst kann dir keiner helfen.

      Gutes Nachschlagwerk für Regex: codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „markus.obi“ ()

      Hallo
      Ich glaube ich habe mich da wohl etwas ünverständlich ausgedrückt :(

      --------------------
      Du sagst die entsprechende Zeile fängt nicht immer mit <option selected="selected" value=" an?
      Woher soll ich das wissen? Du musst schon die Kriterien formulieren, welche Zeile genommen werden soll. Wenn du das nicht machst kann dir keiner helfen.

      ------------------------
      Ich meinte das <option selected="selected" value=" schon immer gleich ist aber die Zahlen die dann kommen sind immer anders da es ja immer das YYYYMMDD ist und das ist ja zwangsweise jeden Tag anders. Ich muss dann die beiden Zahlen die nach dem DD kommen auslesen und in einer Textbox schreiben. Ich habe Deinen Vorschlag probiert und soweit klappt der auch . Es wird mir im Ausgabefenster genau die beiden Zahlen angezeigt die ich auch brauche. Dafür erst einmal vielen Dank. Damit konnte ich mir schon mal in etwa ansehen wie das mit dem suchen geht.
      Ich habe mir gedacht (weil ich es nicht besser weiss) das ich das Datum ( was auf jeden Fall immer das aktuelle ist) selbst erstelle und in dem String einfüge und dann eben mit Deinen Zeile mir die zusätzlichen letzten 2 Zahlen auslese. Wie ich das mache weiss ich noch nicht. Werden wohl wieder ein paar Stunden probieren ;(
      Wie ich dann das Ergebnis vom regex.match in die Textbox bekomme ist dann der 2. Schritt.
      Trotzdem vielen Dank für die Hilfe und Mühe an markus.obi

      hm_krause schrieb:


      Ich habe mir gedacht (weil ich es nicht besser weiss) das ich das Datum ( was auf jeden Fall immer das aktuelle ist) selbst erstelle und in dem String einfüge und dann eben mit Deinen Zeile mir die zusätzlichen letzten 2 Zahlen auslese. Wie ich das mache weiss ich noch nicht. Werden wohl wieder ein paar Stunden probieren ;(

      Warum so kompliziert? Das Regex Pattern von oben gibt doch exakt das zurück was du haben wolltest.
      "(?<=<option selected=""selected"" value=""\d*)\d{2}(?="")"
      Es wird ausschlieslich nach \d{2} gesucht, wenn:
      -Davor <option selected=""selected"" value="" und beliebig viele Ziffern [0-9] stehen.
      -Danach ein " kommt

      Gefunden wird der String 66 zum Beispiel in blablabla<option selected="selected" value="1234566"blabbla
      oder in lalilu<option selected="selected" value="9999999999966"bliblablu
      Wie ich dann das Ergebnis vom regex.match in die Textbox bekomme ist dann der 2. Schritt.

      Dir fehlen anscheinend ein paar Basics (Grundlagen).

      Debug.WriteLine() ist eine Funktion die einen String als Argument erwartet. z.B. Debug.WriteLine("Hello World")
      Regex.Match("suchstring", "pattern").Value ist eine Funktion die das erste Vorkommen von "pattern" in "suchstring" zurückgibt. Rückgabewert ist vom Typ String.
      Sollte kein Problem darstellen der .Text Property (Eigentschaft vom Typ String) der Textbox einen Wert (vom Typ String) zuzuweisen. Bsp. Textbox1.Text = "Hello World"
      Ich hätte mal eine Frage zu meinem Problem:



      Das ist der VB Code (RegEx liegt mir nicht, mein erster Anfang):

      VB.NET-Quellcode

      1. Dim ipRegEx As New Regex("\<a href=\""(?<string>(.*))\""onclick=\""javascript: _gaq.push(['_trackEvent', 'Download', 'Fixer ZIP File', 'ieframe.dll']);\"" class=\""medium_button grey_button zip_download\""\>\><\div class=\""inner\""\>Download zip-file<span class=\""arrow\""\>&gt;<\/span\><\/div\><\/a\>") Dim myIP As String = ipRegEx.Match(httpContent).Groups("string").ToString() MsgBox(myIP)



      Und das der HTML Code den ich auslesen will:

      Quellcode

      1. <a href="/ieframe.zip?0WGjU0bLgS" onclick="javascript: _gaq.push(['_trackEvent', 'Download', 'Fixer ZIP File', 'ieframe.dll']);" class="medium_button grey_button zip_download"><div class="inner">Download zip-file<span class="arrow">&gt;</span></div></a>




      Wie komme ich an den Link in dem href="/ieframe.zip?OWGjU0bLgS" Element drann, die MsgBox zeigt leider nichts an (leer)

      Vielen Dank schonmal :)
      Ich nehme an 'ieframe.zip' bleibt immer gleich??

      Dann musst dein Pattern kürzen und nicht den gesamten HTML Tag als Regel aufstellen sondern so einfach wie möglich machen

      z.B. könnte folgendes funktionieren

      VB.NET-Quellcode

      1. Dim ipRegEx As New Regex("\<a href=\""ieframe.zip?(?<string>([a-zA-Z0-9]*))\"" onclick=\""javascript:")


      Da sehe ich auch, dass du bei deinem Pattern nachdem href-Attribut kein Leerzeichen zu dem onclick-Event gelassen hast und somit kann diese Regel natürlich niemals wirken weil hier ?0WGjU0bLgS" onclick ja ein leerzeichen nach dem Anführungszeichen ist. Hier in der Regel allerdings nicht \""onclick auf sowas musst du auch achten.
      Hallo Zusammen

      Bei mir wird nach folgendem Code nichts angezeigt in meiner RichTextBox:



      VB.NET-Quellcode

      1. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://sourceforge.net/projects/vlc/files/") Dim httpResponse As HttpWebResponse = httpRequest.GetResponse() Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream) Dim httpContent As String = reader.ReadToEnd
      2. Dim ipRegEx As New Regex("\<div class=\""download-bar\""\>(?<string>(.*))\<\/div\>") Dim myIP As String = ipRegEx.Match(httpContent).Groups("string").ToString()
      3. txtsourcecode.Text = myIP



      Der dazugehörige HTML-Teil:

      XML-Quellcode

      1. <div class="download-bar"> Looking for the latest version? <strong> <a href="/projects/vlc/files/latest/download?source=files" title="/2.0.3/win32/vlc-2.0.3-win32.exe: released on 2012- 07-20 10:13:35 UTC"> <span>Download vlc-2.0.3-win32.exe (22.6 MB)</span> </a> </strong> </div>



      Und von diesem HTML Code möchte ich eigentlich schlussentlich nur noch "/2.0.3/win32/vlc-2.0.3-win32.exe" als String haben.

      Kann mir jemand sagen warum der String von oben leer ist und wie ich diesen gewollten Teil im href auslesen kann?


      MfG
      MSeiz5
      Hallo und willkommen hier im Forum.

      Wenn du das nächste mal einen Quellcode postest, dann achte bitte auf die Darstellung des Quellcode. So wie du das gepostet hast, kann es kein Mensch lesen.
      Dafür gibt es eine Vorschau Funktion!

      Dein code würde funktionieren, wenn du den HTML-Quellcode erhalten würdest, denn du gepostet hast.
      Dein Webrequest liefert aber einen anderen Quellcode. Das hättest du im Debug überprüfen können.
      Wahrscheinlich hast du den Code, den du oben gepostet hast aus deinem Firefox rauskopiert.
      Dein Request liefert die Downloadoption für die .tar.xz Version von VLC. (Download vlc-2.0.3.tar.xz (18.3 MB))

      Du solltest besser VLC bescheid sagen, dass du den Quellcode für z.B. Firefox+Windows willst:

      VB.NET-Quellcode

      1. httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
      2. httpRequest.Proxy = Nothing 'Damit der 1.Request nicht so lange dauert



      Desweiteren wirst du nicht drum rum kommen, dir Regex eigenständig anzueignen:
      msdn.microsoft.com/en-us/library/2k3te2cs%28VS.80%29.aspx
      codeproject.com/Articles/9099/The-30-Minute-Regex-Tutorial

      €: Außerdem unbedingt Option Strict On benutzen
      Ich habe 5 Minuten versucht den Code zu formatieren ;) Hat aber ned geklappt...

      Ich benutze Google Chrome. Und wenn ich httpContent ausgebe, dann krieg ich auch den Quelltext aus welchem ich das Beschriebene auslesen will...

      Er würde eben nicht die .tar.xz Version liefern, da ich ja nur den Quelltext auslese von der Seite und anhand des Namen der Daten bei <div class = "download-bar">... den Downloadlink zusammenschneiden möchte.
      So nach tausenden versuchen poste ich doch mal hier drin. Ich versuche vergebens aus

      HTML-Quellcode

      1. <div style="width:345px;float:left; margin-top:11px; overflow:hidden">
      2. <a href="/release/10126" style="color: #FFFFFF">Quincy Sean vs. Seaside Clubbers - String</a>
      3. </div>

      Quincy Sean vs. Seaside Clubbers - String

      das grün makierte als string haben.

      Website is technobase.fm/tracklist/

      EDIT: Wobei sich "/release/10126" style="color: #FFFFFF" verändern tut!


      EDIT2: Habe total vergessen meinen versuchs code anzuhängen... wie peinlich :S

      VB.NET-Quellcode

      1. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://www.technobase.fm/tracklist/")
      2. Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
      3. Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
      4. Dim httpContent As String = reader.ReadToEnd
      5. TextBox1.Text = httpContent
      6. Dim regex As RegularExpressions.Regex = _
      7. New RegularExpressions. _
      8. Regex("(?:href=(?:[""'])([\w\d:#@%/;$()~_?\+-=\\\.&]*)(?:[""']))")
      9. Dim mc As MatchCollection = regex.Matches(TextBox1.Text)
      10. Dim list As List(Of String) = New List(Of String)
      11. For Each m As Match In mc
      12. If m.Groups(1).Value.Contains("/release") Then
      13. ListBox1.Items.Add(m.Groups(1).Value)
      14. End If
      15. Next


      Jetzt bekomme ich alle relevanten links ausgelistet, denn den ich suche ist an zweiter stelle. Jetzt frage ich mich wie ich den linknamen bekomme statt der url. Wie muss ich meinen Regex pattern ändern?

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

      guten tag

      Ich hänge grade total fest ich weiss nicht wie ich den misst rausbekomme sprich den RegEx_Treffer

      VB.NET-Quellcode

      1. Dim RegEx_Treffer As New Regex("(?:src=(?:[""'])([\w\d:#@%/;$()~_?\+-=\\\.&]*)(?:[""']))")



      <IFRAME SRC="DER INHALT ZUM AUSLESEN" FRAMEBORDER=0 MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=NO WIDTH=640 HEIGHT=360></IFRAME>