C#抓取网页乱码

pjw100 2011-07-05 12:09:27
我抓取的地址是搜狐焦点论坛的,例如这个地址:
http://sz.focus.cn/msglist/51806/

编码我试过很多种,gb2312,utf-8...都试过了,始终是乱码。
抓取html代码的程序很简单

能否有哪位大神写个简单的抓取,就应对上面那个地址,乱码整的心慌慌啊。


public static void GetWebContent(string url)
{
try
{

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
//myHttpWebRequest.SendChunked = true;
//myHttpWebRequest.TransferEncoding = "gb2312";
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
myHttpWebRequest.ContentType = "text/html";
//Console.WriteLine("The encoding method used is: " + myHttpWebResponse.ContentEncoding);
Console.WriteLine("字符编码:" + myHttpWebResponse.CharacterSet);
Stream webStream = myHttpWebResponse.GetResponseStream();
string encoding = myHttpWebResponse.CharacterSet;
//经过大量测试发现.NET会将gb2312的编码格式识别为ISO-8859-1,故作此处理
encoding = (encoding == "ISO-8859-1") ? "gb2312" : encoding;
//获取的内容是否属于文本
char seperator = '/';
String contenttype = myHttpWebResponse.ContentType;
// 返回 'text' 如果文本类型是'text/html.
String maintype = contenttype.Substring(0, contenttype.IndexOf(seperator));
// 只保存内容为'text'类型的网页,不保存示图片等其他文件
if (String.Compare(maintype, "text") == 0)
{
Console.WriteLine("\n Content type is 'text'.");
StreamReader sw = new StreamReader(webStream, System.Text.Encoding.GetEncoding(encoding));
Console.WriteLine("网页内容:");
StringBuilder sb = new StringBuilder();
while (sw.Peek() >= 0)
{
string strWebContent = sw.ReadLine();
sb.Append(strWebContent);
}
sw.Close();
sw.Dispose();
webStream.Close();

Console.WriteLine(sb.ToString());
}
else
{
Console.Write("网页内容不是文本无法显示!");
}
}
catch (Exception ex)
{
Console.WriteLine("Error:" + ex.Message);
}

}


...全文
199 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
子夜__ 2011-07-05
  • 打赏
  • 举报
回复
可以获取网页编码
/// <summary>
/// 根据 url 获取网页编码
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetEncoding(string url)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
StreamReader reader = null;
try
{
request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
request.AllowAutoRedirect = false;

response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
{
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
else
reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);

string html = reader.ReadToEnd();

Regex reg_charset = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
if (reg_charset.IsMatch(html))
{
return reg_charset.Match(html).Groups["charset"].Value;
}
else if (response.CharacterSet != string.Empty)
{
return response.CharacterSet;
}
else
return Encoding.Default.BodyName;
}
}
catch
{
}
finally
{

if (response != null)
{
response.Close();
response = null;
}
if (reader != null)
reader.Close();

if (request != null)
request = null;

}

return Encoding.Default.BodyName;
}
ycproc 2011-07-05
  • 打赏
  • 举报
回复
是你抓取后接收的编码问题吧?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧