Comment puis-je télécharger une source HTML en C #


109

Comment puis-je obtenir la source HTML avec une adresse Web en c #?

Réponses:


185

Vous pouvez télécharger des fichiers avec la 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");
}

À noter: si plus de contrôle est nécessaire, regardez la classe HttpWebRequest (par exemple, être capable de spécifier l'authentification).
Richard

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

1
Ne serait-il pas prudent d'attraper WebException à ce sujet? Peut-être que c'était supposé. D'autres exceptions ou erreurs doivent-elles être détectées avec cette méthode?
John Washam

4
@JohnWasham - oui, il serait prudent d'attraper des exceptions ici. Heureusement, la plupart des répondants StackOverflow conservent des exemples de code aussi clairs et concis que possible. Rendre l'exemple de code plus proche de la «vraie vie» ne ferait qu'ajouter du bruit.
Chris Rogers

Le problème auquel je suis confronté est que lorsque je télécharge la source de la page et que je reçois des données, si ce site Web est dans une autre langue que ma source de page n'obtient pas ces valeurs
Rush.2707

40

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

20

Le plus récent, le plus récent, à jour réponse
Ce message est vraiment vieux (il est de 7 ans quand j'ai répondu), donc pas l' une des autres réponses a utilisé la nouvelle et recommandée, qui est HttpClientclasse.


HttpClientest considérée comme la nouvelle API et devrait remplacer les anciennes ( WebClientet 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 l'utilisation de la HttpClientclasse (en particulier dans les cas asynchrones), vous pouvez vous référer à cette question


REMARQUE 1: si vous souhaitez utiliser async / await

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

REMARQUE 2: si vous utilisez les fonctionnalités 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();

4
Suggestion: attendez les méthodes asynchrones.
Maarten

@Maarten, le lien suivant montre comment l'utiliser avec async /
await

17

Vous pouvez l'obtenir avec:

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

Court et doux! J'ai trouvé votre suggestion après avoir lu l'exemple de Joe Albahari. LINQPad> Aide> Nouveautés et recherchez Cache.
Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // besoin de renouveler votre client!
user1328350

9
Est-ce que c'est Disposele WebClient?
JD

11

La méthode @cms est la plus récente, suggérée sur le site Web de MS, mais j'avais 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=1500dans certains cas, vous obtenez une erreur de serveur interne (500), bien que cela www.somesite.it/?p=1500fonctionne parfaitement dans le navigateur Web .

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 documentation officielle

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.