Làm cách nào để tải xuống mã nguồn HTML trong C #


109

Làm cách nào để lấy nguồn HTML được cung cấp một địa chỉ web trong c #?

Câu trả lời:


185

Bạn có thể tải xuống các tệp bằng lớp 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");
}

Cần lưu ý: nếu cần kiểm soát nhiều hơn, hãy xem lớp HttpWebRequest (ví dụ: có thể chỉ định xác thực).
Richard

1
Có, HttpWebRequest cung cấp cho bạn nhiều quyền kiểm soát hơn, mặc dù bạn có thể thực hiện các yêu cầu POST với WebClient bằng cách sử dụng client.UploadData (uriString, "POST", postParamsByteArray);
CMS

1
Sẽ không thận trọng khi bắt gặp WebException xung quanh vấn đề này? Có lẽ điều đó đã được giả định. Bất kỳ trường hợp ngoại lệ hoặc lỗi nào khác cần được phát hiện với phương pháp này?
John Washam

4
@JohnWasham - vâng, sẽ rất thận trọng nếu bắt các trường hợp ngoại lệ ở đây. Tuy nhiên, rất may, hầu hết những người trả lời StackOverflow giữ cho mã ví dụ rõ ràng và ngắn gọn nhất có thể. Làm cho mã ví dụ gần với "cuộc sống thực" sẽ chỉ thêm nhiễu.
Chris Rogers

Vấn đề i mặt là khi tôi tải pagesource và nhận dữ liệu hơn nếu trang web đó là trong ngôn ngữ khác ngoài pagesource của tôi là không nhận được những giá trị
Rush.2707

40

về cơ bản:

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

Câu trả lời mới nhất, gần đây nhất, cập nhật
Bài đăng này thực sự cũ (tôi đã trả lời được 7 năm rồi), vì vậy không ai trong số các câu trả lời khác sử dụng cách mới và được đề xuất, đó là HttpClientlớp học.


HttpClientđược coi là API mới và nó sẽ thay thế các API cũ ( WebClientWebRequest)

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

để biết thêm thông tin về cách sử dụng HttpClientlớp (đặc biệt là trong trường hợp không đồng bộ), bạn có thể tham khảo câu hỏi này


4
Đề xuất: chờ các phương thức không đồng bộ.
Maarten

@Maarten liên kết sau cho biết cách sử dụng điều này với async / await stackoverflow.com/questions/33020657/…
Hakan Fıstık

17

Bạn có thể lấy nó bằng:

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

Ngắn và ngọt! Tôi tìm thấy gợi ý của bạn sau khi tôi đọc ví dụ của Joe Albahari. LINQPad> Trợ giúp> Có gì mới và tìm kiếm Cache.
Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // cần cập nhật khách hàng của bạn!
user1328350

9
Liệu rằng Disposesự WebClient?
JD

11

@cms là cách gần đây hơn, được đề xuất trong trang web MS, nhưng tôi đã gặp một vấn đề khó giải quyết, với cả hai phương pháp được đăng ở đây, bây giờ tôi đăng giải pháp cho tất cả!

vấn đề: nếu bạn sử dụng url như thế này: www.somesite.it/?p=1500trong một số trường hợp, bạn gặp lỗi máy chủ nội bộ (500), mặc dù trong trình duyệt web, điều này www.somesite.it/?p=1500hoàn toàn hoạt động.

giải pháp: bạn phải di chuyển các tham số, mã làm việc là:

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

đây là tài liệu chính thức

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.