Как загрузить исходный код HTML на C #


109

Как я могу получить источник HTML по веб-адресу в С #?

Ответы:


185

Вы можете скачивать файлы с помощью класса 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");
}

Следует отметить: если требуется больше контроля, посмотрите на класс HttpWebRequest (например, возможность указать аутентификацию).
— Ричард

1
Да, HttpWebRequest дает вам больше контроля, хотя вы можете выполнять запросы POST с помощью WebClient, используя client.UploadData (uriString, «POST», postParamsByteArray);
— CMS

1
Разве не разумно было бы поймать WebException вокруг этого? Может быть, это предполагалось. Какие-либо другие исключения или ошибки необходимо отловить с помощью этого метода?
— Джон Уошам

4
@JohnWasham - да, было бы разумно поймать здесь исключения. К счастью, большинство респондентов StackOverflow стараются сохранить пример кода как можно более ясным и кратким. Если приблизить пример кода к «реальной жизни», это только добавит шума.
— Крис Роджерс

Проблема я лицо в том , что , когда я загрузить исходный текст и получить данные , чем если веб - сайт на другом языке , чем мой исходный текст не получает эти значения
— Rush.2707

40

в принципе:

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

Самый новый, самый последний, актуальный ответ
Этот пост действительно старый (ему 7 лет, когда я ответил на него), поэтому ни в одном из других ответов не использовался новый и рекомендуемый способ, которым является HttpClientкласс.


HttpClientсчитается новым API и должен заменить старые ( WebClientи 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;
   }
}

для получения дополнительной информации о том, как использовать HttpClientкласс (особенно в случаях async), вы можете обратиться к этому вопросу


ПРИМЕЧАНИЕ 1. Если вы хотите использовать 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();
   }
}

ПРИМЕЧАНИЕ 2: Если вы используете функции 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
Предложение: дождитесь асинхронных методов.
— Maarten

@Maarten, следующая ссылка показывает, как использовать это с async / await stackoverflow.com/questions/33020657/…
— Hakan Fıstık 06

17

Вы можете получить это с помощью:

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

Коротко и мило! Я нашел ваше предложение после того, как прочитал пример Джо Альбахари. LINQPad> Справка> Новые возможности и выполните поиск по запросу «Кэш».
— Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // нужно обновить вашего клиента!
— user1328350

9
Это Disposeто WebClient?
— JD

11

Способ @cms - более свежий, предложенный на веб-сайте MS, но у меня была трудная проблема, которую нужно было решить, оба метода опубликованы здесь, теперь я публикую решение для всех!

проблема: если вы используете такой URL-адрес: www.somesite.it/?p=1500в некоторых случаях вы получаете внутреннюю ошибку сервера (500), хотя в веб-браузере это www.somesite.it/?p=1500отлично работает.

Решение: вам нужно переместить параметры, рабочий код:

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

здесь официальная документация

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.