6 Stimmen

C# Herunterladen von Website in String mit C# WebClient oder HttpWebRequest

Ich versuche, den Inhalt einer Website herunterzuladen. Für eine bestimmte Webseite enthält die zurückgegebene Zeichenfolge jedoch durcheinandergewürfelte Daten, die viele Zeichen enthalten.

Hier ist der Code, den ich ursprünglich verwendet habe.

HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.Method = "GET";
req.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))";
string source;
using (StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream()))
{
    source = reader.ReadToEnd();
}
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(source);

Ich habe auch alternative Implementierungen mit WebClient versucht, aber immer noch das gleiche Ergebnis:

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
using (WebClient client = new WebClient())
using (var read = client.OpenRead(url))
{
    doc.Load(read, true);
}

Nach der Suche vermute ich, dass es sich um ein Problem mit der Kodierung handeln könnte, also habe ich beide unten aufgeführten Lösungen ausprobiert, aber ich kann sie immer noch nicht zum Laufen bringen.

Die beanstandete Seite, die ich anscheinend nicht herunterladen kann, ist der Artikel Vereinigte_Staaten in der englischen Version von WikiPedia (de . wikipedia . org / wiki / Vereinigte_Staaten). Ich habe allerdings auch eine Reihe anderer Wikipedia-Artikel ausprobiert, bei denen dieses Problem nicht aufgetreten ist.

3voto

BrokenGlass Punkte 153950

Mit dem eingebauten Lader in HtmlAgilityPack hat es bei mir funktioniert:

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://en.wikipedia.org/wiki/United_States");
string html = doc.DocumentNode.OuterHtml; // I don't see no jumbled data here

Editer :

Verwendung einer Standard WebClient mit Ihrem User-Agent führt zu einer HTTP 403 - forbidden - wenn Sie stattdessen dies verwenden, hat es bei mir funktioniert:

using (WebClient wc = new WebClient())
{
    wc.Headers.Add("user-agent", "Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4");
    string html = wc.DownloadString("http://en.wikipedia.org/wiki/United_States");
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
}

Siehe auch diesen SO-Thread: WebClient verbietet das Öffnen der Wikipedia-Seite?

2voto

Peter Punkte 3888

Die Antwort ist gzip-kodiert. Versuchen Sie Folgendes, um den Stream zu dekodieren:

UPDATE

Basierend auf dem Kommentar von BrokenGlass sollte die Einstellung der folgenden Eigenschaften Ihr Problem lösen (hat bei mir funktioniert):

req.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

Alte/manuelle Lösung:

string source;
var response = req.GetResponse();

var stream = response.GetResponseStream();
try
{
    if (response.Headers.AllKeys.Contains("Content-Encoding")
        && response.Headers["Content-Encoding"].Contains("gzip"))
    {
        stream = new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Decompress);
    }

    using (StreamReader reader = new StreamReader(stream))
    {
        source = reader.ReadToEnd();
    }
}
finally
{
    if (stream != null)
        stream.Dispose();
}

1voto

E.J. Brennan Punkte 43746

Dies ist, wie ich in der Regel eine Seite in eine Zeichenfolge (seine VB, aber sollte leicht zu übersetzen) greifen:

req = Net.WebRequest.Create("http://www.cnn.com")
Dim resp As Net.HttpWebResponse = req.GetResponse()
sr = New IO.StreamReader(resp.GetResponseStream())
lcResults = sr.ReadToEnd.ToString

und hatten noch nicht die Probleme, die Sie haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X