c#抓取网页内容出现乱码

zhaoenxiang100 2009-12-01 04:12:45
我做了如下代码读取网页内容,但在分析不同编码的网页时,出现乱码
//取得HTML源码
private string getHtmlInfo(string urlSelet)
{
string strResult = "";
if(urlSelet.Equals(""))
return strResult = "";
//HTML源码
Console.WriteLine("**********************=" + urlSelet);
try
{
//声明一个HttpWebRequest请求
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(urlSelet);
webRequest.Method = "GET";
webRequest.UserAgent = "Opera/9.25 (Windows NT 6.0; U; en)";
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
//Encoding encoding = Encoding.GetEncoding("GB2312");
//取得要取得的网页的编码方式
Encoding encoding = GetEncoding(webResponse);
using (System.IO.Stream stream = webResponse.GetResponseStream())
{
using (System.IO.StreamReader reader = new StreamReader(stream,encoding))
{
strResult = reader.ReadToEnd();
}
}
}
catch (Exception exp)
{

MessageBox.Show("出错:" + exp.Message);

}
return strResult;
}
//取得要取得的网页的编码方式
public Encoding GetEncoding(HttpWebResponse response)
{
Encoding code = Encoding.Default;
string charset = null;
//如果发现content-type头
string ctypeLower = response.Headers["content-type"];
string ctypeOrder = response.Headers["Content-Type"];
string ctype="";
if (!ctypeLower.Equals(""))
ctype = ctypeLower;
if (!ctypeOrder.Equals(""))
ctype = ctypeOrder;
Console.WriteLine("ctype:" + ctype);
if (ctype != null)
{
int ind = ctype.IndexOf("charset=");
if (ind != -1)
{
charset = ctype.ToLower().Substring(ind + 8);
}
}
Console.WriteLine("charset编码格式:" + charset);
if (charset != "")
{
try
{
code = Encoding.GetEncoding(charset);
}
catch{}
}
return code;
}

发现取网页编码时有时能取到,有时去不到,所以还会有显示乱码问题
请求哪位大侠帮我一下
...全文
1671 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
richardzrc 2012-05-29
  • 打赏
  • 举报
回复
怎么办?求大神、
richardzrc 2012-05-29
  • 打赏
  • 举报
回复
还是不行啊
richardzrc 2012-05-29
  • 打赏
  • 举报
回复
我测试了一下,发现还是有问题,对于urf-8可能行,但是对于gb2312的还是不行。
zhaoenxiang100 2009-12-08
  • 打赏
  • 举报
回复
蒋晟这个东西怎样用啊?拜托了!!
蒋晟 2009-12-07
  • 打赏
  • 举报
回复
用IE的IMultiLanguage检测文件编码
影子_爱人 2009-12-06
  • 打赏
  • 举报
回复
顶 学习
fzuwcb 2009-12-06
  • 打赏
  • 举报
回复
关二爷你好!
你的程序我运行了下,系统提示:正在分析“charset=(? <code>[a-zA-Z0-9\-]+)”- 无法识别的分组构造。这是什么错误啊,
zhaoenxiang100 2009-12-04
  • 打赏
  • 举报
回复
我很郁闷
因为我发现有些网页它根本不写编码方式,这个时候我又该怎么办啊
1:http://shop.ebdoor.com/Shops/15495/CompanyCard.aspx
源码里没有编码编码方式,但显示时UTF-8
2:http://www.chaqy.com/qiye-njhjh/
源码里有编码编码方式:<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />但是显示时为UTF-8
3:http://www.mai-miao.com/Web/Info/Detail.aspx?id=16998
源码里没有编码编码方式,但显示时gb2312
zhaoenxiang100 2009-12-03
  • 打赏
  • 举报
回复
是啊,但是不知道为什么去不到utf-8啊
问题就是这个
string ctype = response.ContentType;
结果ctype:text/html
但是它的源码是有编码的
注册失败 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zhaoenxiang100 的回复:]
http://www.dunsh.org/forums/thread-984-1-1.html
这个网页就会出现乱码
各位我做的是一个类似爬虫的程序,窗口和百度首页相似
所以出乱码的网页时随机的
这次我输入了:c#抓取网页内容出现乱码
这个词进行收索,其中当分析道这个网站时就出现了乱码
取得的ctype:text/html
无法取得它的编码方式
所以还要拜托各位帮帮我
[/Quote]

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
页面内部是这么写的啊
zhaoenxiang100 2009-12-03
  • 打赏
  • 举报
回复
http://www.dunsh.org/forums/thread-984-1-1.html
这个网页就会出现乱码
各位我做的是一个类似爬虫的程序,窗口和百度首页相似
所以出乱码的网页时随机的
这次我输入了:c#抓取网页内容出现乱码
这个词进行收索,其中当分析道这个网站时就出现了乱码
取得的ctype:text/html
无法取得它的编码方式
所以还要拜托各位帮帮我
zhaoenxiang100 2009-12-03
  • 打赏
  • 举报
回复
非常感谢
关二哥
zhaoenxiang100 2009-12-03
  • 打赏
  • 举报
回复
做出来了。仰天长叹
注册失败 2009-12-03
  • 打赏
  • 举报
回复
今天下午抽时间研究了一下这个页面:
http://www.dunsh.org/forums/thread-984-1-1.html
实际上页面返回的HTTP如下:
HTTP/1.1 200 OK
Proxy-Connection: close
Connection: close
Content-Length: 33906
Via: 1.1 MSSZISA02
Date: Thu, 03 Dec 2009 08:02:37 GMT
Content-type: text/html
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-Powered-By: PHP/5.2.9-1
Set-Cookie: cdb_sid=plpmwC; expires=Thu, 10-Dec-2009 08:02:37 GMT; path=/
Set-Cookie: cdb_oldtopics=D984D; expires=Thu, 03-Dec-2009 09:02:37 GMT; path=/
Set-Cookie: cdb_visitedfid=9; expires=Sat, 02-Jan-2010 08:02:37 GMT; path=/

从这个HTTP里看到的Content-type: text/html,而微软的HttpWebResponse.CharacterSet,在没有指定编码类型的时候默认返回“ISO-8859-1”编码类型(来源http://channel9.msdn.com/ShowPost.aspx?PostID=166867)而网页实际的编码为UTF-8,因此出现乱码

解决办法:检查CharacterSet属性,如果是ISO-8859-1编码,则默认使用utf-8解码,并使用正则取html中
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
检测出正确的charset,再使用正确的编码对页面进行解码
大致代码如下:
string sUrl = "http://www.dunsh.org/forums/thread-984-1-1.html";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(sUrl);
req.UserAgent = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
req.Accept = "*/*";
req.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
req.ContentType = "text/xml";

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Encoding enc;
try
{
if( resp.CharacterSet != "ISO-8859-1")
enc = Encoding.GetEncoding(resp.CharacterSet);
else
enc = Encoding.UTF8;
}
catch
{
// *** Invalid encoding passed
enc = Encoding.UTF8;
}
string sHTML = string.Empty;
using (StreamReader read = new StreamReader(resp.GetResponseStream(), enc))
{
sHTML = read.ReadToEnd();
Match charSetMatch = Regex.Match(sHTML, "charset=(?<code>[a-zA-Z0-9\\-]+)", RegexOptions.IgnoreCase);
string sChartSet = charSetMatch.Groups["code"].Value;
//if it's not utf-8,we should redecode the html.
if (!string.IsNullOrEmpty(sChartSet) && !sChartSet.Equals("utf-8",StringComparison.OrdinalIgnoreCase))
{
enc = Encoding.GetEncoding(sChartSet);
using (StreamReader read1 = new StreamReader(resp.GetResponseStream(), enc))
{
sHTML = read1.ReadToEnd();
}
}
}
Console.WriteLine(sHTML);
注册失败 2009-12-02
  • 打赏
  • 举报
回复
1.webRequest.Headers.Set("Accept-Encoding","utf-8,gzip");

2.楼主你解析HTML的代码太简单了
网页有可能经过了gzip压缩的,你需要用gzip解压缩
using (System.IO.Stream stream = webResponse.GetResponseStream())
改成
if(webResponse.ContentEncoding.Equals("gzip"))
{
responseStream = new SharpPak.GZInputStream(webResponse.GetResponseStream(), false);
}else{
responseStream=webResponse.GetResponseStream();
}
如果还有出现乱码的页面或者网站,把网址告诉我,我帮你看看

weboscar 2009-12-02
  • 打赏
  • 举报
回复
//从资源下载数据并返回字节数组。(加@是因为网址中间有"/"符号)
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;


文章引用:http://hi.baidu.com/zkbob22/blog/item/646ba2fa79dd796e034f56c5.html
ytycoffe 2009-12-02
  • 打赏
  • 举报
回复
用这个吧string encoding = webResponse.CharacterSet;
wangan2008 2009-12-02
  • 打赏
  • 举报
回复
up
zhaoenxiang100 2009-12-02
  • 打赏
  • 举报
回复
忆云惜梦:
你想用正则式来实现吧!
但是有个问题,你不知道网页的编码是什么啊?有可能是UTF-8也有能是GB2312还可能是GBK
而且Content-Type有时也会是小写的
现在的问题是我用这个方法为什么有时会取不到编码格式?
string ctype = httpWebResponse.ContentType;
fzuwcb 2009-12-02
  • 打赏
  • 举报
回复
关注中!哪位大侠有解决的代码,请传下代码 fzuwcb@126.com
加载更多回复(14)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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