124 votes

Comment télécharger la source HTML en C#

Comment obtenir la source HTML d'une adresse web donnée en C# ?

199voto

CMS Points 315406

Vous pouvez télécharger des fichiers avec l'option Classe WebClient :

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");
}

0 votes

Remarque : si vous avez besoin de plus de contrôle, consultez la classe HttpWebRequest (par exemple, la possibilité de spécifier l'authentification).

1 votes

Oui, HttpWebRequest vous donne plus de contrôle, bien que vous puissiez faire des demandes POST avec WebClient, en utilisant client.UploadData(uriString, "POST",postParamsByteArray) ;

1 votes

Ne serait-il pas prudent d'attraper les WebException's autour de cela ? Peut-être que cela a été supposé. D'autres exceptions ou erreurs doivent-elles être capturées avec cette méthode ?

42voto

Diego Jancic Points 2445

Fondamentalement :

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);

37voto

Hakam Fostok Points 4765

La réponse la plus nouvelle, la plus récente, la plus à jour.
Cet article est très ancien (il a 7 ans lorsque j'y ai répondu), donc aucune des autres réponses n'a utilisé la nouvelle méthode recommandée, qui est la suivante HttpClient classe.


HttpClient est considérée comme la nouvelle API et doit remplacer les anciennes ( WebClient y 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;
   }
}

pour plus d'informations sur la manière d'utiliser le HttpClient (en particulier dans les cas asynchrones), vous pouvez vous référer à la classe cette question


NOTE 1 : Si vous voulez utiliser async/await

string url = "page url";
HttpClient client = new HttpClient();   // actually only one object should be created by Application
using (HttpResponseMessage response = await client.GetAsync(url))
{
   using (HttpContent content = response.Content)
   {
      string result = await content.ReadAsStringAsync();
   }
}

NOTE 2 : Si vous utilisez les fonctionnalités de C# 8

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

17voto

Xenon Points 439

Vous pouvez l'obtenir avec :

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

0 votes

Court et agréable ! J'ai trouvé votre suggestion après avoir lu l'exemple de Joe Albahari. LINQPad > Aide > Quoi de neuf, et recherchez Cache.

7 votes

Var html = new System.Net.WebClient().DownloadString(siteUrl) ; // vous devez créer votre client !

9 votes

Est-ce que Dispose le site WebClient ?

11voto

Xilmiki Points 342

La méthode @cms est la plus récente, suggérée sur le site de MS, mais j'ai eu un problème difficile à résoudre, avec les deux méthodes affichées ici, maintenant je poste la solution pour tous !

problème : si vous utilisez une url comme celle-ci : www.somesite.it/?p=1500 dans certains cas, vous obtenez une erreur de serveur interne (500), bien que dans le navigateur web ce www.somesite.it/?p=1500 fonctionnent parfaitement.

solution : vous devez déplacer les paramètres, le code de travail est :

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

ici la documentation officielle

0 votes

Faites attention lorsque vous utilisez DownloadString, car il casse l'encodage si le site Web n'utilise pas UTF-8. Utilisez plutôt la méthode DownloadData et gérez également l'encodage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X