使用C#获取网页HTML源码的例子
程序员文章站
2024-02-15 09:17:10
最近在做一个项目,其中一个功能是根据一个url地址,获取到网页的源代码。在asp.net(c#)中,获取网页源代码貌似有很多种方法,我随便搞了一个简单的webclient,...
最近在做一个项目,其中一个功能是根据一个url地址,获取到网页的源代码。在asp.net(c#)中,获取网页源代码貌似有很多种方法,我随便搞了一个简单的webclient,非常简单容易。但后面一个非常恼火的问题出来了,那就是中文的乱码。
通过仔细研究,中文的网页不外乎gb2312和utf-8这两种编码。于是有了下面这段代码:
复制代码 代码如下:
/// <summary>
/// 根据网址的url,获取源代码html
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string gethtmlbyurl(string url)
{
using (webclient wc = new webclient())
{
try
{
wc.usedefaultcredentials = true;
wc.proxy = new webproxy();
wc.proxy.credentials = credentialcache.defaultcredentials;
wc.credentials = system.net.credentialcache.defaultcredentials;
byte[] bt = wc.downloaddata(url);
string txt = system.text.encoding.getencoding("gb2312").getstring(bt);
switch (getcharset(txt).toupper())
{
case "utf-8":
txt = system.text.encoding.utf8.getstring(bt);
break;
case "unicode":
txt = system.text.encoding.unicode.getstring(bt);
break;
default:
break;
}
return txt;
}
catch (exception ex)
{
return null;
}
}
}
稍微解释一下,这里使用了webclient创建了一个wc对象(这命名有点尴尬了)。然后调用wc对象的downloaddata方法,传入url值,返回一个字节数组。默认使用gb2312来读取这个字节数组,把它转换成字符串。从网页源代码的字符串中查找网页的编码格式的特征字符,如找到charset="utf-8"这样的信息,来判断当前网页的编码格式。
getcharset这个函数就是来获取当前网页的编码格式的,具体代码如下:
复制代码 代码如下:
/// <summary>
/// 从html中获取获取charset
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string getcharset(string html)
{
string charset = "";
regex regcharset = new regex(@"content=[""'].*\s*charset\b\s*=\s*""?(?<charset>[^""']*)", regexoptions.ignorecase);
if (regcharset.ismatch(html))
{
charset = regcharset.match(html).groups["charset"].value;
}
if (charset.equals(""))
{
regcharset = new regex(@"<\s*meta\s*charset\s*=\s*[""']?(?<charset>[^""']*)", regexoptions.ignorecase);
if (regcharset.ismatch(html))
{
charset = regcharset.match(html).groups["charset"].value;
}
}
return charset;
}
/// 从html中获取获取charset
/// </summary>
/// <param name="html"></param>
/// <returns></returns>
public static string getcharset(string html)
{
string charset = "";
regex regcharset = new regex(@"content=[""'].*\s*charset\b\s*=\s*""?(?<charset>[^""']*)", regexoptions.ignorecase);
if (regcharset.ismatch(html))
{
charset = regcharset.match(html).groups["charset"].value;
}
if (charset.equals(""))
{
regcharset = new regex(@"<\s*meta\s*charset\s*=\s*[""']?(?<charset>[^""']*)", regexoptions.ignorecase);
if (regcharset.ismatch(html))
{
charset = regcharset.match(html).groups["charset"].value;
}
}
return charset;
}
感觉写得不是很好,先将就着用,呵呵。小编原创,转载注明,呵呵。
上一篇: C#中私有构造函数的特点和用途实例解析
下一篇: 合并有序数组的实现(java与C语言)