Come posso scaricare il codice HTML in C #


109

Come posso ottenere l'origine HTML con un indirizzo web in c #?

Risposte:


185

Puoi scaricare file con 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");
}

Dovrebbe notare: se è necessario un maggiore controllo, guarda la classe HttpWebRequest (ad esempio essere in grado di specificare l'autenticazione).
Richard

1
Sì, HttpWebRequest offre un maggiore controllo, sebbene sia possibile eseguire richieste POST con WebClient, utilizzando client.UploadData (uriString, "POST", postParamsByteArray);
CMS

1
Non sarebbe prudente cogliere le WebException intorno a questo? Forse è stato ipotizzato. Eventuali altre eccezioni o errori devono essere rilevati con questo metodo?
John Washam,

4
@ JohnWasham - sì, sarebbe prudente rilevare le eccezioni qui. Per fortuna, tuttavia, la maggior parte degli intervistati StackOverflow mantiene il codice di esempio il più chiaro e conciso possibile. Rendere il codice di esempio più vicino alla "vita reale" aggiungerebbe solo rumore.
Chris Rogers

Il problema che devo affrontare è che quando scarico pagesource e ottengo dati che se il sito web è in una lingua diversa da quella del mio pageource non riceve quei valori
Rush.2707

40

fondamentalmente:

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

La risposta più recente, più recente, aggiornata
Questo post è molto vecchio (ha 7 anni quando ho risposto), quindi nessuna delle altre risposte ha utilizzato il modo nuovo e consigliato, che è la HttpClientclasse.


HttpClientè considerata la nuova API e dovrebbe sostituire quelle vecchie ( WebCliente 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;
   }
}

per maggiori informazioni su come usare la HttpClientclasse (specialmente nei casi asincroni), puoi fare riferimento a questa domanda


NOTA 1: se si desidera utilizzare 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();
   }
}

NOTA 2: se si utilizzano le funzionalità 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
Suggerimento: attendi i metodi asincroni.
Maarten

@Maarten i seguenti spettacoli di collegamento come usare questo con async / attendono stackoverflow.com/questions/33020657/...
Hakan Fistik

17

Puoi ottenerlo con:

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

Breve e dolce! Ho trovato il tuo suggerimento dopo aver letto l'esempio di Joe Albahari. LINQPad> Guida> Novità e cerca Cache.
Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // bisogno di rinnovare il tuo cliente!
user1328350

9
Quello è Disposeil WebClient?
JD

11

Il modo @cms è il più recente, suggerito nel sito di MS, ma ho avuto un problema difficile da risolvere, con entrambi i metodi pubblicati qui, ora posto la soluzione per tutti!

problema: se usi un URL come questo: www.somesite.it/?p=1500in alcuni casi ottieni un errore interno del server (500), anche se nel browser web www.somesite.it/?p=1500funziona perfettamente.

soluzione: devi spostare i parametri, il codice di lavoro è:

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

qui documentazione ufficiale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.