WebClient.DownloadString() - unterschiedliche Werte bei Resultat und in Debug.WriteLine(Resultat)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von DanCooper.

    WebClient.DownloadString() - unterschiedliche Werte bei Resultat und in Debug.WriteLine(Resultat)

    Hallo

    folgendes Problem: In Zeile 2 ist der Wert von test ein anderer als in Zeile 7. Wie kann das den sein (clientIsBusy springt übrigens nie an)?
    In Zeile 7 wären dann alle Infos die ich brauche geladen.

    VB.NET-Quellcode

    1. Using client As New WebClient
    2. Dim test As String = client.DownloadString("https://www.videobuster.de/dvd-bluray-verleih/107275/avatar")
    3. While client.IsBusy
    4. Debug.WriteLine("IsBusy")
    5. End While
    6. Debug.WriteLine(String.Concat("################################################## ", DateTime.Now.ToString))
    7. Debug.WriteLine(test)
    8. End Using

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DanCooper“ ()

    Hab deinen Code mal testweise laufen lassen.

    Ich habe genau das ergebnis was der Code machen soll.
    Er speichert in der Variable "test" den HTML Code und gibt ihn im Debug aus.
    Genau das was sein soll ?

    Greetz
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    client.IsBusy kann nie True sein, denn die DownloadString-Funktion kehrt erst zurück, sobald der Download abgeschlossen ist.
    Damit wir Dein Problem verstehen können, musst Du uns schon zeigen, was ausgegeben wurde. Einfach in einem [code][/code]-Tag hier posten.
    Was erwartest Du denn, was passiert? Und was passiert stattdessen bzw. was passiert nicht?

    Edit:
    Mir fällt gerade auf:
    In Zeile 2 ist der Wert von test ein anderer als in Zeile 7.

    Wie hast Du das denn rausgefunden?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    client.IsBusy kann nie True sein, denn die DownloadString-Funktion kehrt erst zurück, sobald der Download abgeschlossen ist.
    Davon bin ich auch ausgegangen. Hab's aber, weil das Ergebnis unterschiedlich war, trotzdem ausprobiert um zu sehen, ob er irgendwann mal in die Schleife fällt.

    Wert wenn ich bei Zeile 3 pausiere und den Wert von test über die Lupe kopiere (laut Notepad++ 176 Zeilen): siehe Anhang Zeile3.txt
    Wert der bei Zeile 7 im Direktfenster ausgegeben wird (laut Notepad++ 1236 Zeilen): siehe Anhang Zeile7.txt

    Mir fehlt bei Zeile 3 der ganze <div class="playlist"> Bereich (neben all dem anderen was fehlt). Wenn ich mit test weiterarbeite ändert sich nichts mehr, ist immer der selbe Inhalt wie bei Zeile 3.
    Dateien
    • Zeile3.txt

      (32,98 kB, 282 mal heruntergeladen, zuletzt: )
    • Zeile7.txt

      (643,78 kB, 1.179 mal heruntergeladen, zuletzt: )
    Kannst Du bitte alles aus der Methode rauswerfen, bis nur noch so viel übrig ist, dass Du den Fehler reproduzieren kannst?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Kannst Du bitte alles aus der Methode rauswerfen, bis nur noch so viel übrig ist, dass Du den Fehler reproduzieren kannst?


    Naja, viel ist da ja eh nicht vorhanden:

    VB.NET-Quellcode

    1. Using client As New WebClient
    2. Dim test As String = client.DownloadString("https://www.videobuster.de/dvd-bluray-verleih/107275/avatar")
    3. Debug.WriteLine(test)
    4. End Using


    Reproduzierung:
    Bei Zeile 3 einen Haltepunkt einfügen, mit Maus auf test fahren, Lupe klicken, den Inhalt kopieren und in Notepad++ einfügen.
    Danach weiterlaufen lassen, Debug-Text im Direktfenster kopieren und ebenfalls in Notepad++ einfügen.
    Texte vergleichen und feststellen, dass sie unterschiedlich sind.
    Könnte vielleicht an Javascripts liegen die erst später geladen werden und somit dann auch erst später was verändern.
    Da meisten Javascripts ( bei mir und anderen ) zum schluss geladen werden anstatt am anfang.

    Könnte ich mir jetzt als mögliche Quelle vorstellen.

    GReetz
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Füg mal Clipboard.SetText(test) ein und füge das in Notepad++ ein (oder einen ähnlichen Editor, der Zeilennummern richtig anzeigt).
    Die erste Zeile ist sehr lang. 3157 Zeichen, um genau zu sein. Wenn Du versuchst, so viel Text im Direktfenster anzuzeigen, fügt es zwischendurch immer wieder Zeilenumbrüche ein. Nach 1025 Zeichen, um genau zu sein.
    Wenn Du dann den Text wieder aus dem Direktfenster rauskopierst, sind diese neuen Zeilenumbrüche auch dabei. Das lässt den Inhalt anders aussehen.
    Also die Lösung: Lange Texte nicht aus dem Direktfenster rauskopieren.

    Nochwas: Da Du test in Zeile 2 zuweist und in Zeile 3 verwendest, kann sich der Inhalt in der Zwischenzeit nicht verändern. Geht ja gar nicht. Also kannst Du davon ausgehen, dass das Problem beim Rausfinden, ob die Texte gleich sind, liegt.

    Edit:
    @xChRoNiKx
    Der WebClient lädt nur runter. Der führt kein JavaScript aus.
    Und sogar wenn er was ausführen würde: Nachdem die Funktion zurückkehrt und der String zur Variable zugewiesen wurde, kann sich der Inhalt der Variable nicht "magisch" von alleine verändern. Man muss der Variable schon was zuweisen, dass sie sich verändert. Aber das ist hier nicht der Fall.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    xChRoNiKx schrieb:

    Könnte vielleicht an Javascripts liegen die erst später geladen werden und somit dann auch erst später was verändern.
    Da meisten Javascripts ( bei mir und anderen ) zum schluss geladen werden anstatt am anfang.

    Könnte ich mir jetzt als mögliche Quelle vorstellen.

    GReetz


    Habe ich mir auch gedacht, denn die Website enthält auf jeden Fall Java. Interessant ist jedoch, dass wenn ich nach der Debug.WriteLine(test) nochmals einen Haltepunkt einfüge (sozusagen Zeile 4), der Wert von test immer noch der selbe wie in Zeile 2 ist, obwohl in Zeile 3 viel mehr in das Direktfenster geschrieben wird. ?(

    EDIT:
    @Niko Ortner
    Verwirrung perfekt, aber du hast teilweise recht. Mit Clipboard.SetText(test) ist der Inhalt der selbe wie im Direktfenster. Über die Lupe wird aber definitv nicht der selbe Inhalt ausgegeben, denn in der Lupe sind um die 32'000 Zeichen, im Direktfenster/Clipboard um die 640'000 Zeichen.

    Aber das Problem ist für mich somit gelöst, dann stimmt der Inhalt überein und ich kann meine Regex entsprechend einsetzen. Ich hab mich beim fehlschlagen meiner Regex natürlich auf den Inhalt der Lupe verlassen und mich gefragt, warum das nicht die ganze Website geladen worden ist...

    Danke an alle!

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

    Mit Clipboard.SetText(test) ist der Inhalt der selbe wie im Direktfenster.

    Das glaube ich nicht:

    VB.NET-Quellcode

    1. Using client As New System.Net.WebClient
    2. Dim Test = client.DownloadString("https://www.videobuster.de/dvd-bluray-verleih/107275/avatar")
    3. System.IO.File.WriteAllText("C:\Users\Niko\Desktop\Download1.txt", Test, System.Text.Encoding.UTF8)
    4. Clipboard.SetText(Test)
    5. Debug.Print(Test)
    6. End Using


    Download1.txt ist direkt in eine Datei gespeichert. Da kann nichts anders sein.
    new3 kommt von Clipboard.SetText. Ist das selbe wie Download1.txt
    new2 ist aus dem Direktfenster rauskopiert. Das ist anders.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Mit Clipboard.SetText(test) ist der Inhalt der selbe wie im Direktfenster.

    Das glaube ich nicht:

    VB.NET-Quellcode

    1. Using client As New System.Net.WebClient
    2. Dim Test = client.DownloadString("https://www.videobuster.de/dvd-bluray-verleih/107275/avatar")
    3. System.IO.File.WriteAllText("C:\Users\Niko\Desktop\Download1.txt", Test, System.Text.Encoding.UTF8)
    4. Clipboard.SetText(Test)
    5. Debug.Print(Test)
    6. End Using

    vb-paradise.de/index.php/Attac…3e77ccb72bcce14cd9fe7b2c1
    Download1.txt ist direkt in eine Datei gespeichert. Da kann nichts anders sein.
    new3 kommt von Clipboard.SetText. Ist das selbe wie Download1.txt
    new2 ist aus dem Direktfenster rauskopiert. Das ist anders.

    Na dann öffne mal die Zeile3.txt, die ich beim Post 4 angehängt habe und such da drin nach "playlist". Das ist nichts und das habe ich per Copy-Paste auf der Lupen-Ansicht übernommen.

    Edit: Ich hab übrigens "Clipboard.SetText(test) ist der Inhalt der selbe wie im Direktfenster." geschriben, Betonung auf "der selbe". Nur in der Lupen-Ansicht fehlt ein Teil.
    ch hab übrigens "Clipboard.SetText(test) ist der Inhalt der selbe wie im Direktfenster." geschriben,

    Definiere bitte "der selbe".
    Für mich ist "das selbe" das hier:

    VB.NET-Quellcode

    1. Dim A As String = ...
    2. Dim B As String = ...
    3. Dim IstDasSelbe As Boolean = (A = B)

    Wenn IstDasSelbe True ist, dann ist es für mich das selbe.

    Der Inhalt von Test und das, was im Direktfenster angezeigt wird, ist für mich nicht das selbe (wie im Screenshot gezeigt gibt es Unterschiede).
    Der Inhalt von Test und was durch Clipboard.SetText in die Zwischenablage kopiert wird, ist für mich jedeoch das selbe.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    ch hab übrigens "Clipboard.SetText(test) ist der Inhalt der selbe wie im Direktfenster." geschriben,

    Definiere bitte "der selbe".
    Für mich ist "das selbe" das hier:

    VB.NET-Quellcode

    1. Dim A As String = ...
    2. Dim B As String = ...
    3. Dim IstDasSelbe As Boolean = (A = B)

    Wenn IstDasSelbe True ist, dann ist es für mich das selbe.

    Der Inhalt von Test und das, was im Direktfenster angezeigt wird, ist für mich nicht das selbe (wie im Screenshot gezeigt gibt es Unterschiede).
    Der Inhalt von Test und was durch Clipboard.SetText in die Zwischenablage kopiert wird, ist für mich jedeoch das selbe.


    Ja sorry, hast recht, hab mich nicht korrekt ausgedrückt. Aber bei mir ist in der Text-Schnellansicht nicht mal annähernd soviel Text drin wie bei allen anderen Ausgaben, die Du aufgezeigt hast. Hast Du dir das mal angeschaut? Da fehlen nicht einfach ein paar Umbrüche oder so, da fehlen ganze Abschnitte (siehe Screenshot).

    Die letzte Zeile ist aber trotzdem die selbe, nämlich </span><!-- c:0 --><!-- r: --></div><div id="persistent-body"></div></body></html>. Der String wird also zumindest nicht einfach irgendwann abgeschnitten.
    In der Schnellansicht sind 32'975 Zeichen aufgeführt, in der Download1.txt sind es 642'500. Das hat doch nichts mehr mit Umbrüchen oder dergleichen zu tun. In der Schnellansicht wird definitv weniger angezeigt oder irgendwas nicht ausgewertet. Warum?
    Bilder
    • FWV8tXi.png

      57,28 kB, 909×779, 108 mal angesehen
    Nun, bei mir sind in der Schnellansicht geringfügig mehr Zeichen drin. Das dürften die zusätzlich eingefügten Zeilenumbrüche sein, die ab einer Zeilenlänge von ca. 1024 Zeichen eingefügt werden.
    Die Schnellansicht zeigt bei also auch nicht den richtigen Text an, aber es wird nichts rausgeschnitten.
    Wie prüfst Du, wie viele Zeichen in der Schnellansicht bzw. generell in Texten drin sind?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Nun, bei mir sind in der Schnellansicht geringfügig mehr Zeichen drin. Das dürften die zusätzlich eingefügten Zeilenumbrüche sein, die ab einer Zeilenlänge von ca. 1024 Zeichen eingefügt werden.
    Die Schnellansicht zeigt bei also auch nicht den richtigen Text an, aber es wird nichts rausgeschnitten.
    Wie prüfst Du, wie viele Zeichen in der Schnellansicht bzw. generell in Texten drin sind?
    In diesem Fall habe ich einfach den Inhalt mit CTRL+A und CTRL+C in Notepad++ übertragen.
    Mir ist das ganze eigentlich nur aufgefallen, weil meine Regex nicht mehr funktioniert hat. Ich hab dann den Wert über das Schnellfenster analysiert/kopiert, um die Regex anzupassen. Dabei ist mir aufgefallen, dass eben nicht das drin steht, was ich erwartet hatte.

    Grundsätzlich würde ich mit .Length oder sowas zählen.
    Ich hab den Text jetzt mal aus dem Schnellüberwachungsfenster in Notepad++ kopiert und das sagt bei mir auch 642756 Zeichen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Visual Basic 2010 Express.
    Was passiert bei Dir, wenn Du diesen String im Schnellüberwachungsfenster anschaust?

    VB.NET-Quellcode

    1. Dim Test2 = New String("x"c, 642756)

    Ich hab das jetzt mal in 2015 Enterprise probiert. Da wird der Text gekürzt, und zwar nach dem Schema: Wenn die Länge des Textes kleiner oder gleich 32768 (2^16) ist, dann wird der Text im Schnellüberwachungsfenster unverändert angezeigt. Ist er dagegen länger, wird in der Mitte Text rausgenommen und stattdessen drei Punkte eingefügt, sodass der Text 32768 Zeichen lang ist.
    Das erklärt, warum Text fehlt. Eigentlich bescheuert, das erst bei so langen Texten zu machen, denn die Punkte findet da drin sowieso kein Mensch mehr.

    Ok. Also ist klar: Das Schnellüberwachungsfenster lügt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Visual Basic 2010 Express.
    Was passiert bei Dir, wenn Du diesen String im Schnellüberwachungsfenster anschaust?

    VB.NET-Quellcode

    1. Dim Test2 = New String("x"c, 642756)

    Ich hab das jetzt mal in 2015 Enterprise probiert. Da wird der Text gekürzt, und zwar nach dem Schema: Wenn die Länge des Textes kleiner oder gleich 32768 (2^16) ist, dann wird der Text im Schnellüberwachungsfenster unverändert angezeigt. Ist er dagegen länger, wird in der Mitte Text rausgenommen und stattdessen drei Punkte eingefügt, sodass der Text 32768 Zeichen lang ist.
    Das erklärt, warum Text fehlt. Eigentlich bescheuert, das erst bei so langen Texten zu machen, denn die Punkte findet da drin sowieso kein Mensch mehr.

    Ok. Also ist klar: Das Schnellüberwachungsfenster lügt.


    Lol, drei Punkte in der Mitte eines Textes mit über 32768 Zeichen macht total Sinn... Warum wird auf sowas nicht deutlich hingewiesen? Manchmal frage ich mich ja schon...

    Besten Dank für's nachprüfen, ich werde nun in Zukunft bei grossen Texten darauf achten.