Mal wieder Regex Probleme...

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Mal wieder Regex Probleme...

    Moin,

    Ich habe mal wieder Probleme mit Regex.
    Und zwar möchte ich auf einer Page einen div tag auslesen, der z.B so aussieht:
    <div contenteditable="true" id="c4c584786b7a9b0307e3a7_input" class="Mentions_Input DOMControl_placeholder" style="width: 502px;"></div>

    So, was ich brauch ist im Grunde nur die Id. Was ja eigentlich nicht weiter schwer ist.
    Mein Problem ist aber, das die ID bei jedem neu laden der Page anders ist. Also beim refresh dann z.B so ist:
    <div contenteditable="true" id="c4c584786b7a9b03072aF4_input" class="Mentions_Input DOMControl_placeholder" style="width: 502px;"></div>

    Nun dachte ich mir evtl. kann da der _input teil helfen?
    Sprich, kann man die Nummer der ID dann immer auslesen?
    Würde mich über hilfe freuen.

    Lg.Killerhamster08
    Wie liest Du denn die Seite aus, mit dem WebBroweser oder per httpRequest/WebRequest ?

    Mit dem WebBrowser ist es natürlich einfach, hier gibt es die getElementByID Methode des HTMLDocuments.

    Nachtrag: mit Regex geht es mit folgender Pattern

    VB.NET-Quellcode

    1. Dim match As Match = Regex.Match(inputString, "id=""(\w*)_input""")

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

    Super, die Methode von Kangaroo läuft ohne probs =)
    Jetz muss ich nur noch nen Button drücken, das geht soweit ich weiß so:

    VB.NET-Quellcode

    1. WebBrowser1.Document.Forms(0).InvokeMember("button")


    Jetz ist der Button so aufgebaut:
    <input value="Teilen" type="button">

    Weder "Button" noch "Teilen" funktioniert aber für das InvokeMember.
    Gibts da ne lösung?

    Lg
    Wäre hilfreicher wenn Du uns die geheimnisvolle Seite nennen würdest auf die Du zugreifen willst. Grundsätzlich kannst Du Dir die Form und die Input-Elemente so ungefähr laden:

    VB.NET-Quellcode

    1. WebBrowser1.Navigate("http://de-de.facebook.com/")
    2. ' auf Seite warten
    3. While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
    4. Application.DoEvents()
    5. End While
    6. ' alle forms
    7. Dim forms As HtmlElementCollection = WebBrowser1.Document.Forms
    8. ' alle Input-Felder der Form (0)
    9. Dim inputFields As HtmlElementCollection = forms(0).GetElementsByTagName("input")

    wobei Du das natürlich auif Deine Seite anpassen musst.

    Die Input-Felder füllst Du mit SetAttribute, die Form schickst Du ab mit .InvokeMember("Submit"), bzw. simulierst einen Button-Click mit loginBtn.InvokeMember("click"). Dabei ist der Login-Button natürlich eins der Input-Elemente.

    Hoffe ich habe alle Klarheiten beseitigt ...
    Also,

    Ich hab jetz einfach mal

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. Label1.Text = "True"
    3. End Sub


    Dann zeigt er ja wenns voll ist, dann hab ich mit nem Button halt den Aufruf:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim match As Match = Regex.Match(WebBrowser1.DocumentText, "textarea id=""(\w*)_input""")
    3. Dim a As String = match.Groups(1).Value
    4. Dim target as string = a & "_input"
    5. WebBrowser1.Document.GetElementById(target).InnerText = "Test"
    6. Dim frm As HtmlElement = WebBrowser1.Document.GetElementById("login_form")
    7. frm.InvokeMember("submit")
    8. End Sub

    Dann kommt der Fehler
    Was kann jetz falsch sein?

    Lg

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

    killerhamster08 schrieb:

    Was kann jetz falsch sein?

    Öhm, so ziemlich alles bis auf die letzten 2 Zeilen ?

    Wie beschrieben musst Du das Laden der WebSeite abwarten und ausserdem solltest Du Dich mal mit den Möglichkeiten des HTML-Documents und seiner Methoden beschäftigen.

    So gehts besser:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. WebBrowser1.Navigate("http://www.facebook.com/sharer.php?u=google.de")
    3. ' auf Seite warten
    4. While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete
    5. Application.DoEvents()
    6. End While
    7. With WebBrowser1.Document
    8. ' email holen & setzen
    9. Dim eMail As HtmlElement = .GetElementById("email")
    10. eMail.SetAttribute("value", "ichhassefacebook@spammail.de")
    11. ' passwort holen & setzen
    12. Dim pw As HtmlElement = .GetElementById("pass")
    13. pw.SetAttribute("value", "malwiedervergessen")
    14. ' form submit
    15. Dim frm As HtmlElement = .GetElementById("login_form")
    16. frm.InvokeMember("submit")
    17. End With
    18. End Sub

    killerhamster08 schrieb:

    Wir ham uns da völlig falsch verstanden. Der User ist schon eingeloggt, sprich er ist schon auf der nächsten Seite.

    Macht ja nix, schliesslich ist das Prinzip immer das Gleiche. Nur kenne ich Facebook nicht besonders gut um zu wissen was auf der nächsten Seite ist.

    Quellcode

    1. WebBrowser1.Document.GetElementById(target).InnerText = "Test"

    Welches element willst Du dort holen ? Um etwas einzutragen muss es ein Input-Element sein. Das musst Du nicht notwendig über die ID identifizieren, es geht auch wie oben beschrieben über den Index des Input-Elements

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

    Kangaroo schrieb:

    killerhamster08 schrieb:

    Wir ham uns da völlig falsch verstanden. Der User ist schon eingeloggt, sprich er ist schon auf der nächsten Seite.

    Macht ja nix, schliesslich ist das Prinzip immer das Gleiche. Nur kenne ich Facebook nicht besonders gut um zu wissen was auf der nächsten Seite ist.

    Quellcode

    1. WebBrowser1.Document.GetElementById(target).InnerText = "Test"

    Welches element willst Du dort holen ? Um etwas einzutragen muss es ein Input-Element sein. Das musst Du nicht notwendig über die ID identifizieren, es geht auch wie oben beschrieben über den Index des Input-Elements
    Mit dem da unten, sprich target setzt sich aus der ID der oben ermittelten ID und dem _input zusammen. Da füge ich halt den Text ein, das funktioniert auch. Nur der Buttin ist das Problem.
    .Document.GetElementsBytagname("input")(index).InvokeMember("click")
    den index kann ich nicht sagen, musst halt zählen, das wievielte Element es ist, welches mit <input beginnt...(evtl. sollte man wissen, was dieser macht, dann könnte man es sicher über InvokeScript regeln...)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---