c#抓取网页有时是乱码,有时是好的,求教高手 根据读取的文件头字节判断,或根据网页的charset标识符判断、然后再设置GetEncoding("gb2312"))为什么 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题是GB2312有时可以,有时不行,而Unicode、UTF-8等都不行,试着用webResponse.CharacterSet,取到的编码为:iso-8859-1,但是这个打开的网页还是乱码,求教 人家服务器没有发送编码就弄个默认值iso-8859-1。很有可能网页是经过压缩了。你搜索一下网页压缩 gzip。解压缩以后才能用正确的编码得到html字符串。 public static string GetEncoding(string Url) { try { HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(Url); myHttpWebRequest.AllowAutoRedirect = false; HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); myHttpWebResponse.Close(); return Regex.Match(myHttpWebResponse.Headers.Get("Content-Type"), @"(?is)(?<=char\-?set[:=])\S+").Value; } catch { return ""; } } using (HttpWebResponse response = (HttpWebResponse)webrequest.GetResponse()) { if (response.ContentEncoding.ToLower().Contains("gzip")) { using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress)) { using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { model.html = reader.ReadToEnd(); } } } else if (response.ContentEncoding.ToLower().Contains("deflate")) { using (DeflateStream stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress)) { using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { model.html = reader.ReadToEnd(); } } } else { using (Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) { model.html = reader.ReadToEnd(); } } } } 用浏览器访问下对方网站,抓包看看对方用的什么编码gzip是浏览器发送支持gzip标志才返回gzip压缩数据,模拟发送的时候不要发送gzip标志,或者发送后回来解压缩也好 14楼正解,十分感谢大家,我跟踪了代码,时而进入第一个if,时而进入else,说明这个网页时而压缩,时而不压缩,网页是http://www.okooo.com/jingcai/,大家有兴趣可以抓取看看是不是这么回事。 另外我是用正则匹配得到网页数据的,有时候网页源码的编码一旦变了,就得修改正则表达式,这个不利于后期代码维护,所以想问问除了正则,还有没有什么可靠地办法来稳定的获取网页数据?欢迎大家探讨。 试试HtmlAgilityPack,解析html不一定非要用正则 hjywyj说的我刚才上网搜了一下,貌似很好用,我再研究下,你的方法很好,我的分不多,给你和yonglaixiazaide一点意思一下,同时也十分感谢大家,谢谢。 http://www.86y.org/art_detail.aspx?id=722 用了14楼的方法然后自己再引用了一下。希望能给大家带来帮助 【求】如何获取正在运行的应用程序,就和任务管理器一样 帮我写个c#版的http代理程序 异步Socket通信时(Tcp/Ip协议),关于在客户端和服务器端自动显示对方发送数据的问题。 关于自定义表单的问题,很着急,在线忘高人指点。 99分求助一个小地方~!大虾速来哦,很简单但我就是找不到那个属性 水晶报表显示的问题 如何在后台动态生成表格并且填入数据,并且放入checkbox 访问数组的效率,用IEnumerable比用下标,效率更低吗? 求助 请问如何使弹出菜单右端对齐某个位置? 托管c++调用C#遇到的难题 如何配置web页面,使其可以匿名访问
人家服务器没有发送编码就弄个默认值iso-8859-1。
很有可能网页是经过压缩了。
你搜索一下网页压缩 gzip。
解压缩以后才能用正确的编码得到html字符串。
{
try
{
HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(Url);
myHttpWebRequest.AllowAutoRedirect = false;
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
myHttpWebResponse.Close();
return Regex.Match(myHttpWebResponse.Headers.Get("Content-Type"), @"(?is)(?<=char\-?set[:=])\S+").Value;
}
catch { return ""; }
}
{ if (response.ContentEncoding.ToLower().Contains("gzip"))
{
using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{ model.html = reader.ReadToEnd();
}
}
}
else if (response.ContentEncoding.ToLower().Contains("deflate"))
{
using (DeflateStream stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress))
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{ model.html = reader.ReadToEnd();
} }
}
else
{
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{ model.html = reader.ReadToEnd();
}
}
}
}
gzip是浏览器发送支持gzip标志才返回gzip压缩数据,模拟发送的时候不要发送gzip标志,或者发送后回来解压缩也好
另外我是用正则匹配得到网页数据的,有时候网页源码的编码一旦变了,就得修改正则表达式,这个不利于后期代码维护,所以想问问除了正则,还有没有什么可靠地办法来稳定的获取网页数据?欢迎大家探讨。