C#获取网页源码,自动判断网页字符集编码[转]

最近开始打算重新学习C#,并且尝试做点C#练习。而最让我感兴趣的还是和网站相关的东西。那就做个获取网站源码,采集文章的功能吧。

根据网上的资料,使用WebClient来获取源码,很容易就能得到网页源码。但是,发现,不同网站的网页字符编码就不一样的,如何自动分别不同网 站的字符编码,而正确解释网页中的汉字呢。在C#里,提供了丰富的工具类库,可以轻松的转码。但是,却发现不能自动获取网站上的字符编码而自动正确的解释 源码,而导致汉字显示乱码。以前我也用JAVA做过这样的功能,获取网站源码,同样,在JAVA的各种获取网站源码的类库里,也不能自动根据网页字符编码 自动正确解释编码,只能我们自己手动来做了。

我的解决办法是先采用系统默认的编码从stream里得到源码,再使用正则表达式获取源码中的[获取网页字符编码描述信息],这个信息,一般来说, 网页里都会有的,在网页源码的<head>里,类似这样的代码:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />(其实不一样完全这样,有些不规范的,没有双引号,或者最后面没有/闭合,所以,正则表达式得考虑周全些),从这个代码里来获取编码信息,再判 断系统当前的默认编码是否和这个一样,如果不同,再使用网页中取到的编码来重新从stream里解释取得网页源码。

源码如下:(下面这段代码是一个完整的获取网页源码,且自动正确解释汉字)


using  System.Net;
using  System.IO;
using  System.Text.RegularExpressions;
// url是要访问的网站地址,charSet是目标网页的编码,如果传入的是null或者"",那就自动分析网页的编码
private   string  getHtml( string  url,  string  charSet)
{
    
// 创建WebClient实例myWebClient
    WebClient myWebClient  =   new  WebClient(); 
    
//  需要注意的:
    
// 有的网页可能下不下来,有种种原因比如需要cookie,编码问题等等
    
// 这是就要具体问题具体分析比如在头部加入cookie
    
//  webclient.Headers.Add("Cookie", cookie);
    
// 这样可能需要一些重载方法。根据需要写就可以了

    
// 获取或设置用于对向 Internet 资源的请求进行身份验证的网络凭据。
    myWebClient.Credentials  =  CredentialCache.DefaultCredentials;
    
// 如果服务器要验证用户名,密码
    
// NetworkCredential mycred = new NetworkCredential(struser, strpassword);
    
// myWebClient.Credentials = mycred;
    
// 从资源下载数据并返回字节数组。(加@是因为网址中间有"/"符号)
     byte [] myDataBuffer  =  myWebClient.DownloadData(url);
    
string  strWebData  =  Encoding.Default.GetString(myDataBuffer);

    
// 获取网页字符编码描述信息
    Match charSetMatch  =  Regex.Match(strWebData,  " <meta([^<]*)charset=([^<]*)\" " , RegexOptions.IgnoreCase  |  RegexOptions.Multiline);
    
string  webCharSet  =  charSetMatch.Groups[ 2 ].Value;
    
if  (charSet  ==   null   ||  charSet  ==   "" )
    charSet 
=  webCharSet;

    
if  (charSet  !=   null   &&  charSet  !=   ""   &&  Encoding.GetEncoding(charSet)  !=  Encoding.Default)
    strWebData 
=  Encoding.GetEncoding(charSet).GetString(myDataBuffer);
    
return  strWebData;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值