Regex - PHP-Code auslesen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Regex - PHP-Code auslesen

    Hey,

    ich habe vor, aus einer Seite eine Beschreibung (Grüner Strich - Blauer Strich) auszulesen. Das ganze habe ich mit Regex gemacht. Es funktioniert aber nur bei Beschreibungen, die nicht iwie formatiert wurden (Fettschrift, SpanClass ...). Bei formatierten Texten wird einfach nix ausgelesen. So sieht mein VB-Code aus:

    VB.NET-Quellcode

    1. 'Neuen Webclient deklarieren
    2. Dim w As New WebClient
    3. 'Quelltext downloaden => String
    4. Dim buffer() As Byte = w.DownloadData(TextBox_weblink.Text)
    5. Dim quelltext As String = System.Text.Encoding.UTF8.GetString(buffer)
    6. 'Wert filtern
    7. Dim WertTitel As New System.Text.RegularExpressions.Regex("<div id=""extinfo_title""> <h3>(?<Titel>(.*))</h3>")
    8. Dim WertBeschreibung As New System.Text.RegularExpressions.Regex("<div class=""article_text"" style=""margin:0;"">(?<Beschreibung>(.*))<p>Quelle:")
    9. Dim WertBild As New System.Text.RegularExpressions.Regex("<div id=""poster"" style=""line-height:0;""><div> <img src=""(?<Bild>(.*))"" alt=")
    10. 'Wert mit hilfe von Pattern im Quelltext suchen => auswerten
    11. Dim EndTitel As String = WertTitel.Match(quelltext).Groups("Titel").ToString()
    12. Dim EndBeschreibung As String = WertBeschreibung.Match(quelltext).Groups("Beschreibung").ToString()
    13. Dim www As String = ("http://www.xrel.to")
    14. Dim EndBilder As MatchCollection = WertBild.Matches(quelltext)
    15. Dim EndBild As String = www & EndBilder(0).Groups("Bild").ToString()
    16. 'Dim EndBild As String = WertBild.Match(quelltext).Groups("Bild").ToString()
    17. 'Dim EndBild As MatchCollection = WertBild.Matches(quelltext)
    18. 'Als Beispiel in richtextbox ausgeben:
    19. Form1.TextBox_Titel.Text = EndTitel
    20. Form1.TextBox_Beschreibung.Text = (Split(EndBeschreibung, " />")(0)).TrimEnd("""")
    21. Form1.TextBox_BildURL.Text = (Split(EndBild, """")(0))
    22. MsgBox("Die Daten wurden erfolgreich ausgelesen!")
    23. Form1.Show()


    Wenn die Beschreibung aus reinem Text besteht, gehts:



    Sobald PHP-/Html-Code in der Beschreibung ist, gehts nicht:



    Kann mir jmd. sagen was ich falsch gemacht habe, dass der nur reine Texte ausliest?
    hmm, Regex sieht richtig aus, allerdings verwende ich selber nie "(?<Beschreibung>", insofern kann ich diesen Teil nicht beurteilen. Was macht er ohne diesen Teil, wenn Du die group(1) direkt indexierst ?

    Nachstellen im Regex-Tester konnte ich es auch nicht, da Deine beiden Beispiele als Grafik abgelegt waren.

    Allerdings: bist Du Dir sicher dass Regex hier der richtige Weg ist ? Schliesslich werden immer irgendwelche HTML-Befehle im Ergebnis vorhanden sein, die dann evtl. bei Deiner Ergebnisanzeige stören könnten - oder nicht ?

    Eine Alternative wäre das casten zu einem HTMLDocument, wo Du die HTML-Elemente nach dem Node mit der Klasse 'article_text" durchsuchen könntest und den reinen Text als Node.innertext ausgeben könntest.
    Hay,
    für die Seite xrel.to/game/57199/Grand-Theft…es-from-Liberty-City.html
    geht es so:

    VB.NET-Quellcode

    1. Dim Reg As Regex
    2. Dim Client As New Net.WebClient()
    3. Client.Encoding = System.Text.Encoding.UTF8
    4. Dim M As MatchCollection = Reg.Matches(Client.DownloadString("http://www.xrel.to/game/57199/Grand-Theft-Auto-Episodes-from-Liberty-City.html"), ":</span><br />([^<]+)")
    5. RichTextBox1.Text += M(0).Groups(1).Value + vbNewLine
    6. RichTextBox1.Text += M(1).Groups(1).Value


    Mfg Kevin.
    ":</span><br />([^<]+)"
    Was macht dieser Code genau? Weil ich wollte eigtl., dass diese Sachen wie (

    PHP-Quellcode

    1. <span class="bb_b">
    ), (

    PHP-Quellcode

    1. </span><br />
    ) aus der Beschreibung auch mit ausgelesen werden. Mein Problem lag ursprünglich darin, dass gar nix ausgelesen wurde. Mit deinem Code wird die Beschreibung zwar ausgelesen, jedoch ohne die o.g. Sachen.

    Wie kann ich es machen, dass Die Komplette Beschreibung samt PHP-Code ausgelesen wird (Der komplette DIV (article_text))?
    Kann man nicht aus VisualBasic direkt den DIV ansprechen?

    Vielen Dank :)
    Es wäre vielleicht nützlich zu wissen warum Du all diese HTML-Tags mitlesen möchtest, schliesslich stören die ja meistens wenn man nur auf den reinen Test angewiesen ist.

    Sollten die DIV-Tags variable Formatierungen haben, wird das meines Erachtens mit Regex langsam dünne. Aber ich lasse mich da gerne von den Regex-Gurus hier belehren.

    Dann hast Du 2 Möglichkeiten:

    Du holst Dir die Seite mit dem WebBrowser Control. Das hat den Vorteil das das Ergebnis nicht als Text , sondern als HTMLDOCUMENT zurückbekommst. Hier kannst Du dann per GETELEMENTBYTAGNAME alle Div-Tag auf EINMAL in ein Array einlesen und die raussuchen, die das Attribute "Class='Article_Text" besitzen.

    Mit den Properties .INNERTEXT hast Du dann den gesamten Text innerhalb des DIV Elementes, und mit .INNERHTML den ganzen HTML-Code dieses Elementes. Je nachdem was Du in diesem Fall brauchst.

    Das geht mit dem Ergebnis vom WebClient oder vom HTTPWebRequest nur über das HTMLAgilityPack, mit dem man Text-Dokumente in ein HTMLDOCUMENT umwandeln kann. Zwar eine tolle Sache, aber in Deinem Fall vielleicht etwas zu komplex. HTMLAgility ist eine DLL die über eine Referenz eingebunden wird.

    Wie gesagt, ohne genau zu wissen was und wie Du Dein Ergebnis brauchst, kann ich nur raten ...
    Hey,
    danke für die Infos. Ich werds mal versuchen wie du´s beschrieben hast.

    Aber eine Frage hab ich noch:

    Kann mir jmd. diesen Codeausschnitt mal erklären?

    VB.NET-Quellcode

    1. ":</span><br />([^<]+)"


    Was macht dieser Teil genau?

    Danke :)
    Sorry, ganz vergessen:

    In worten würde das ungefähr so heissen:

    - suche im Dokument eine Stelle die mit ":</span><br />" anfängt
    - dann nehme ALLES danach bis zu dem nächsten "<" Zeichen

    Die runden Klammern "(" und ")" holen Dir das "Alles" nur raus damit du es in eine Variable laden kannst.