WebPage href auslesen

  • C#
  • .NET (FX) 4.5–4.8

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

    WebPage href auslesen

    Hallo.

    Ich stoße derzeit vor ein Problem.
    Ich möchte ein Tool schreiben, dass meine Eingaben direkt an eine Website weiter gibt und damit interagiert.

    Beispiel:

    Ich habe eine Website zu der ich so navigiere: (HINWEIS: Alles über Console!!)

    C#-Quellcode

    1. static void StartBrowserTh()
    2. {
    3. var th = new Thread(() =>
    4. {
    5. var wb = new WebBrowser();
    6. wb.DocumentCompleted += browser_DocumentCompleted;
    7. wb.ScriptErrorsSuppressed = true;
    8. wb.Navigate("WEBSITE");
    9. Application.Run();
    10. });
    11. th.SetApartmentState(ApartmentState.STA);
    12. th.Start();
    13. }


    Das funktioniert und ich komme auch an.
    Perfekt.

    Nun habe ich da eine Textbox und einen Button.

    Die Textbox hat folgende HTML beschreibung:

    HTML-Quellcode

    1. <input type="text" name="file" id="file" placeholder="Hier muss was rein" size="50">


    und der Button Folgende:

    HTML-Quellcode

    1. <input type="submit" class="waves-effect waves-light btn" style="background-color: #4db6ac;" name="submit" id="submit" onclick="start();" value="button">


    So.... folgendes habe ich gemacht.
    Nachdem ich also auf der Website bin möchte ich etwas eintragen in die Textbox. (in dem fall "test")

    C#-Quellcode

    1. HtmlElement textElement = wb.Document.All.GetElementsByName("file")[0];
    2. textElement.SetAttribute("value", "Test");


    und dann möchte ich den Button betätigen und somit auslösen, dass die website etwas macht.

    C#-Quellcode

    1. HtmlElement btnElement = wb.Document.All.GetElementsByName("submit")[0];
    2. btnElement.InvokeMember("click");


    Das problem ist. Wenn dort etwas passiert verändert sich nicht die URL sondern nur das Document.

    Habe also im Endeffekt 2 Probleme:

    A) Kann ich irgendwie überprüfen ob sich das Document geändert hat, und wenn ja wie?
    B) Möchte ich dann noch eine HREF die im Document erstellt wird nach dem clicken auslesen

    Dazu habe ich gegoogelt und folgendes gefunden:

    C#-Quellcode

    1. var expression = "href=\"(.*)\"";
    2. var list = wb.Document.GetElementsByTagName("a")
    3. .Cast<HtmlElement>()
    4. .Where(x => Regex.IsMatch(x.OuterHtml, expression))
    5. .Select(x => Regex.Match(x.OuterHtml, expression).Groups[1].Value)
    6. .ToList();
    7. Console.WriteLine(list.Any());


    Nur leider gibt mir die Console "false" aus.

    HTML-Quellcode

    1. <a href="?dl=LINK" onclick="started();" class="">Voila.</a>


    Hoffe ihr könnt helfen.

    Grüße!
    Hast du dir schon mal probiert nach der where Klausel dir mal die Anzahl der Elemente auzugeben, welche deinem RegEx Pattern entsprechen?

    Edit: Oder hast du schon mal geschaut, ob nicht dein RegEx falsch ist?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

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

    Radinator schrieb:

    Hast du dir schon mal probiert nach der where Klausel dir mal die Anzahl der Elemente auzugeben, welche deinem RegEx Pattern entsprechen?

    Edit: Oder hast du schon mal geschaut, ob nicht dein RegEx falsch ist?


    Also meine where Klausel zu ner Liste.Any() ergibt false.
    Wüsste nicht was an meinem regex pattern falsch ist :(

    Verzweifle bisschen
    Hast du dir schon mal probiert nach der where Klausel dir mal die Anzahl der Elemente auzugeben, welche deinem RegEx Pattern entsprechen?
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Jap, ist 0.
    Ich glaube ich mache hier was falsch.

    Wenn ich den Button drücken würde auf der page, so ändert sich die URL nicht, aber das eigentliche Document was ich sehe wird refreshed und ich sehe einen anderen text als zu vor.
    Da hab ich mal ne frage. Kann ich irgendwie checken, ob sich das Document geändert hat, und wenn ja, kann ich mir den text des neuen documentes anzeigen lassen?

    @Radinator

    Fachkraftx3 schrieb:

    Wenn ich den Button drücken würde auf der page, so ändert sich die URL nicht, aber das eigentliche Document was ich sehe wird refreshed und ich sehe einen anderen text als zu vor.
    (CMS in Website einbinden)

    Was genau soll der Satz denn bitte bedeuten???

    Lg Radinator

    PS: Ich gehe mal davon aus, du setzt hinter dein .Where(x => Regex.IsMatch(x.OuterHtml, expression)) einfach ein .Count().ToString(). Wenn da der Wert 0 rauskommt, bedeutet das, dass dein Linq Query keine Einträge findet. Also entweder gibt es keine ElementsByTagName("a") oder dein RegEx Pattern ist einfach falsch.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Radinator schrieb:

    Fachkraftx3 schrieb:

    Wenn ich den Button drücken würde auf der page, so ändert sich die URL nicht, aber das eigentliche Document was ich sehe wird refreshed und ich sehe einen anderen text als zu vor.
    (CMS in Website einbinden)

    Was genau soll der Satz denn bitte bedeuten???

    Lg Radinator

    PS: Ich gehe mal davon aus, du setzt hinter dein .Where(x => Regex.IsMatch(x.OuterHtml, expression)) einfach ein .Count().ToString(). Wenn da der Wert 0 rauskommt, bedeutet das, dass dein Linq Query keine Einträge findet. Also entweder gibt es keine ElementsByTagName("a") oder dein RegEx Pattern ist einfach falsch.


    Tschuldige, war der Idiot hier.
    Habe den Webbrowser Task beendet, bevor er das 2te mal das Dokument laden konnte.
    Sprich ich habe jetzt meinen Link erhalten den ich gesucht habe.
    RegEx war auch richtig :)

    Ich hab dennoch ne weitere frage (weiß nicht ob ich dafür n neuen thread erstellen soll)
    Der Link ist ein Download und nutzt ne sogenannte "SessionID".
    Wenn ich jetzt aber mit meinem WebBrowser ne anfrage starte, und dann damit nen Link erhalte mit der SessionID drinne (zb. ?dl=c1x6nd0y&key=ed0c48e1c65a94adb7c5ce763f40ada0 wobei key die sessionID ist nehm ich an), gibt es da ne möglichkeit wie ich meinem WebClient der die Datei Async runterladen soll diese gleiche sessionID geben kann? (bzw. die vom WebBrowser speichern aber im Webclient nutzen, da die SessionID hier mit md5 gecrypted wurde)
    Könntest versuchen die URL aus dem HtmlDocument zu extrahieren und ihn dem WebClient (oder was auch immer du zum downloaden verwendest) übergeben.
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell