Jak mogę pobrać źródło HTML w C #


109

Jak mogę uzyskać źródło HTML, podając adres internetowy w języku C #?

Odpowiedzi:


185

Możesz pobierać pliki z klasą 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");
}

Warto zauważyć: jeśli potrzebna jest większa kontrola, spójrz na klasę HttpWebRequest (np. Możliwość określenia uwierzytelniania).
Richard

1
Tak, HttpWebRequest daje ci większą kontrolę, chociaż możesz wykonywać żądania POST z WebClient, używając client.UploadData (uriString, "POST", postParamsByteArray);
CMS

1
Czy nie byłoby rozsądnie złapać WebException wokół tego? Może tak było. Czy w przypadku tej metody trzeba wykryć jakieś inne wyjątki lub błędy?
John Washam,

4
@JohnWasham - tak, rozsądnie byłoby wychwycić tutaj wyjątki. Na szczęście jednak większość respondentów StackOverflow utrzymuje przykładowy kod tak przejrzysty i zwięzły, jak to tylko możliwe. Przybliżenie przykładowego kodu do „prawdziwego życia” po prostu dodałoby szum.
Chris Rogers,

Problem, z którym się spotykam, polega na tym, że kiedy pobieram źródło strony i pobieram dane, to gdy ta witryna jest w innym języku niż moje źródło strony nie otrzymuje tych wartości
Rush.2707

40

gruntownie:

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

Najnowsza, najnowsza, aktualna odpowiedź
Ten post jest naprawdę stary (ma 7 lat, kiedy na niego odpowiedziałem), więc żadna z pozostałych odpowiedzi nie skorzystała z nowego i zalecanego sposobu, jakim jest HttpClientklasa.


HttpClientjest uważany za nowy interfejs API i powinien zastąpić stare ( WebClienti 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;
   }
}

aby uzyskać więcej informacji na temat korzystania z HttpClientklasy (szczególnie w przypadkach asynchronicznych), możesz skierować to pytanie


UWAGA 1: Jeśli chcesz używać 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();
   }
}

UWAGA 2: Jeśli używasz funkcji języka 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
Sugestia: poczekaj na metody asynchroniczne.
Maarten

@Maarten poniższy link pokazuje, jak używać tego z async /
await

17

Możesz to zdobyć za pomocą:

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

Krótkie i słodkie! Znalazłem twoją sugestię po przeczytaniu przykładu Joe Albahariego. LINQPad> Pomoc> Co nowego i wyszukaj pamięć podręczną.
Colin,

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // musisz odświeżyć swojego klienta!
user1328350

9
Czy to Disposejest WebClient?
JD

11

@cms jest nowszą, sugerowaną na stronie MS, ale miałem trudny problem do rozwiązania, z obiema metodami zamieszczonymi tutaj, teraz zamieszczam rozwiązanie dla wszystkich!

problem: jeśli używasz takiego adresu URL: www.somesite.it/?p=1500w niektórych przypadkach pojawia się wewnętrzny błąd serwera (500), chociaż w przeglądarce internetowej to www.somesite.it/?p=1500działa doskonale.

rozwiązanie: musisz przenieść parametry, kod roboczy to:

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

tutaj oficjalna dokumentacja

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.