Wie kann ich eine HTML-Quelle in C # herunterladen?


108

Wie kann ich der HTML-Quelle eine Webadresse in c # geben?

Antworten:


184

Sie können Dateien mit der WebClient-Klasse herunterladen :

using System.Net;

using (WebClient client = new WebClient ()) // WebClient class inherits IDisposable
{
    client.DownloadFile("http://yoursite.com/page.html", @"C:\localfile.html");

    // Or you can get the file content without saving it
    string htmlCode = client.DownloadString("http://yoursite.com/page.html");
}

Beachten Sie Folgendes: Wenn mehr Kontrolle erforderlich ist, sehen Sie sich die HttpWebRequest-Klasse an (z. B. in der Lage, die Authentifizierung anzugeben).
Richard

1
Ja, HttpWebRequest bietet Ihnen mehr Kontrolle, obwohl Sie POST-Anforderungen mit WebClient mithilfe von client.UploadData (uriString, "POST", postParamsByteArray) ausführen können.
CMS

1
Wäre es nicht klug, WebException zu fangen? Vielleicht wurde das angenommen. Müssen andere Ausnahmen oder Fehler mit dieser Methode abgefangen werden?
John Washam

4
@ JohnWasham - ja, es wäre ratsam, hier Ausnahmen zu fangen. Zum Glück halten die meisten StackOverflow-Befragten den Beispielcode so klar und präzise wie möglich. Wenn Sie den Beispielcode näher an das "echte Leben" bringen, wird nur Rauschen hinzugefügt.
Chris Rogers

Das Problem, dem ich gegenüberstehe, ist, dass wenn ich eine Seitenquelle herunterlade und Daten erhalte, als wenn diese Website in einer anderen Sprache als meiner Seitenquelle vorliegt, diese Werte nicht erhalten werden
Rush.2707

40

Grundsätzlich:

using System.Net;
using System.Net.Http;  // in LINQPad, also add a reference to System.Net.Http.dll

WebRequest req = HttpWebRequest.Create("http://google.com");
req.Method = "GET";

string source;
using (StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream()))
{
    source = reader.ReadToEnd();
}

Console.WriteLine(source);

19

Die neueste, aktuellste und aktuellste Antwort
Dieser Beitrag ist wirklich alt (es ist 7 Jahre alt, als ich ihn beantwortet habe), daher hat keine der anderen Antworten die neue und empfohlene Methode verwendet, die HttpClientKlasse ist.


HttpClientwird als neue API betrachtet und sollte die alten ersetzen ( WebClientund WebRequest)

string url = "page url";
HttpClient client = new HttpClient();
using (HttpResponseMessage response = client.GetAsync(url).Result)
{
   using (HttpContent content = response.Content)
   {
      string result = content.ReadAsStringAsync().Result;
   }
}

Weitere Informationen zur Verwendung der HttpClientKlasse (insbesondere in asynchronen Fällen) finden Sie unter dieser Frage


4
Vorschlag: Warten Sie auf die asynchronen Methoden.
Maarten

@ Maarten der folgende Link zeigt, wie man dies mit async / await stackoverflow.com/questions/33020657/… verwendet
Hakan Fıstık

17

Sie können es bekommen mit:

var html = new System.Net.WebClient().DownloadString(siteUrl)

Kurz und bündig! Ich habe Ihren Vorschlag gefunden, nachdem ich das Beispiel von Joe Albahari gelesen habe. LINQPad> Hilfe> Was ist neu und suchen Sie nach Cache.
Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // müssen Ihren Client neu einrichten!
user1328350

8
Ist das Disposedas WebClient?
JD

11

@cms Weg ist der neuere, auf der MS-Website vorgeschlagene, aber ich hatte ein schwer zu lösendes Problem. Beide Methoden wurden hier veröffentlicht. Jetzt poste ich die Lösung für alle!

Problem: Wenn Sie eine URL wie diese verwenden: www.somesite.it/?p=1500In einigen Fällen wird ein interner Serverfehler (500) angezeigt, obwohl dies im Webbrowser www.somesite.it/?p=1500einwandfrei funktioniert.

Lösung: Sie müssen Parameter verschieben, Arbeitscode ist:

using System.Net;
//...
using (WebClient client = new WebClient ()) 
{
    client.QueryString.Add("p", "1500"); //add parameters
    string htmlCode = client.DownloadString("www.somesite.it");
    //...
}

hier offizielle Dokumentation

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.