¿Cómo puedo descargar código HTML en C #?


109

¿Cómo puedo obtener la fuente HTML con una dirección web en c #?

Respuestas:


185

Puede descargar archivos con la clase 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");
}

Debe tener en cuenta: si se necesita más control, mire la clase HttpWebRequest (por ejemplo, poder especificar la autenticación).
Richard

1
Sí, HttpWebRequest le da más control, aunque puede hacer solicitudes POST con WebClient, usando client.UploadData (uriString, "POST", postParamsByteArray);
CMS

1
¿No sería prudente detectar WebException alrededor de esto? Quizás eso se asumió. ¿Es necesario detectar otras excepciones o errores con este método?
John Washam

4
@JohnWasham: sí, sería prudente detectar excepciones aquí. Afortunadamente, sin embargo, la mayoría de los encuestados de StackOverflow mantienen el código de ejemplo lo más claro y conciso posible. Hacer el código de ejemplo más cercano a la "vida real" solo agregaría ruido.
Chris Rogers

El problema al que me enfrento es que cuando descargo la fuente de página y obtengo datos que si ese sitio web está en otro idioma que mi fuente de página no obtiene esos valores
Rush.2707

40

básicamente:

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

La respuesta más reciente, más reciente y actualizada
Esta publicación es muy antigua (tiene 7 años cuando la respondí), por lo que ninguna de las otras respuestas usó la forma nueva y recomendada, que es la HttpClientclase.


HttpClientse considera la nueva API y debería reemplazar las antiguas ( WebClienty 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;
   }
}

para obtener más información sobre cómo usar la HttpClientclase (especialmente en casos asincrónicos), puede consultar esta pregunta


4
Sugerencia: espere los métodos asincrónicos.
Maarten

@Maarten, el siguiente enlace muestra cómo usar esto con async /
await

17

Puedes conseguirlo con:

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

¡Corto y dulce! Encontré tu sugerencia después de leer el ejemplo de Joe Albahari. LINQPad> Ayuda> Novedades y busque Caché.
Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // ¡Necesita renovar a su cliente!
user1328350

9
¿Eso es Disposeel WebClient?
JD

11

@cms way es el más reciente, sugerido en el sitio web de MS, pero tuve un problema difícil de resolver, con ambos métodos publicados aquí, ¡ahora publico la solución para todos!

problema: si usa una url como esta: www.somesite.it/?p=1500en algún caso, obtiene un error interno del servidor (500), aunque en el navegador web esto www.somesite.it/?p=1500funciona perfectamente.

solución: tienes que mover los parámetros, el código de trabajo es:

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

aquí documentación oficial

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.