如何在C#中下载HTML源代码

121

在C#中如何获取给定网址的HTML源代码?

5个回答

198
你可以使用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类(例如,能够指定身份验证)。 - Richard
1
是的,HttpWebRequest 给你更多的控制权,虽然你可以使用 WebClient 进行 POST 请求,使用 client.UploadData(uriString,"POST",postParamsByteArray); - Christian C. Salvadó
1
在这个方法周围捕获WebException是否明智?也许这是被假定的。还需要使用此方法捕获其他任何异常或错误吗? - John Washam
4
@JohnWasham - 是的,在这里捕获异常是明智的。然而,值得庆幸的是,大多数StackOverflow回答者都会尽可能使示例代码清晰简洁。让示例代码更接近“现实生活”只会增加噪音。 - Chris Rogers
我面临的问题是,当我下载网页源代码并获取数据时,如果该网站是其他语言,则我的页面源代码无法获取这些值。 - Rush.2707

42

基本上:

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

34
最新、最近、最新的答案
这篇文章真的很旧了(我回答时已经七年了),因此其他答案中没有人使用新的和推荐的方法,即HttpClient类。

HttpClient 被认为是新的 API,应该取代旧的 API(WebClientWebRequest

HttpClient client = new HttpClient();   // actually only one object should be created by Application
string page = await client.GetStringAsync("page URL here");

更长的方式

string url = "page url";
HttpClient client = new HttpClient();   // actually only one object should be created by Application
using (HttpResponseMessage response = await client.GetAsync(url))
{
   using (HttpContent content = response.Content)
   {
      string pageContent = await content.ReadAsStringAsync();
   }
}

5
建议:等待异步方法。 - Maarten
@Maarten 以下链接展示了如何在使用 async/await 方式中使用它:https://dev59.com/_FwY5IYBdhLWcg3wF0de#33031778 - Hakan Fıstık
在这里使用异步调用有什么优势吗? - Gary Bao 鲍昱彤
我认为在可能的情况下始终建议使用async,因为这可能需要时间,而您不希望用Wait()调用阻塞线程。 - Hakan Fıstık
谢谢。使用HttpClient比使用WebClient快得多。 - Toni
1
@MartinSchneider 谢谢您的留言,问题出在使用了仅支持 .NET 5 及以上版本的 CancellationToken 的重载。我已经更新了答案,感谢您的提醒。 - Hakan Fıstık

17

您可以使用以下方法获取HTML源代码:

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

简短而精炼!在阅读了Joe Albahari的示例之后,我找到了您的建议。LINQPad > 帮助 > 新功能,并搜索缓存。 - Colin
7
var html = new System.Net.WebClient().DownloadString(siteUrl); // 需要创建一个新的客户端对象! - Banoona
9
那会释放WebClient吗? - J D

11

@cms 的方法是最近在微软网站上推荐的,但我曾经遇到一个很难解决的问题,在这里发布所有的解决方案!

问题: 如果您使用像这样的URL:www.somesite.it/?p=1500,有时会出现内部服务器错误(500),即使在Web浏览器中这个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");
    //...
}

这里是官方文档


请注意使用DownloadString时要小心,因为如果网站没有使用UTF-8编码,它会破坏编码。相反,请使用DownloadData方法并处理编码部分。 - Alexandru Dicu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接