我就是写了一个类,想获得某个网页的源代码
由于每个网页的编码方式不一样,可能是utf-8,gbk,gb2312等,所以
1)首先以默认编码方式获取源代码字符串(可能存在识别错误,中文无法显示)
2)在1中寻找charset关键字,后面跟的是编码方式,获取之
3)用2中获得的编码方式再次重新正确的解析源代码字符串但是现在碰到个问题,程序在30行时会报错,“流不可读”,请问这个怎么解决呢?
由于这个类要被循环利用,所以不希望两次Get网页源代码,一次用于识别编码,一次正确翻译,只希望读一次就解析出正确的源代码,求大神帮忙看看,怎么改才好?另外,37-50是我写的另一种方法,但是发现获得的网页源代码会被莫名其妙的截断,只能显示开头的一部分,后面都会丢失,小白在这里求教了
static class HTTP_Interaction
{
static public string GetURL(string strURL, string cookie)
{
try
{
HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(strURL);
if (cookie != "")
{
wr.Headers["cookie"] = cookie; //设置cookie
}
using (HttpWebResponse wsp = (HttpWebResponse)wr.GetResponse())
{
using (Stream st = wsp.GetResponseStream())
{
//默认编码读取结果
Encoding DefaultCharset = Encoding.Default; //默认编码
StreamReader sr = new StreamReader(st, DefaultCharset);
string result = sr.ReadToEnd();
sr.Close(); //获得charset编码格式
string AutoCharset = "";
AutoCharset = result.Substring(result.IndexOf("charset="));
AutoCharset = AutoCharset.Replace("charset=", "");
AutoCharset = AutoCharset.Substring(0, AutoCharset.IndexOf("\"")); //charset编码读取结果
Encoding AutoEncoding = Encoding.GetEncoding(AutoCharset);
StreamReader sr2 = new StreamReader(st, DefaultCharset);
result = sr2.ReadToEnd();
sr2.Close(); return result;
////读取二进制编码
//byte[] SourceCode = new byte[50 * 1024];
//st.Read(SourceCode, 0, SourceCode.Length); ////默认编码读取结果
//Encoding DefaultCharset = Encoding.Default; //默认编码
//string result = DefaultCharset.GetString(SourceCode); ////获得charset编码格式
//string AutoCharset = "";
//AutoCharset = result.Substring(result.IndexOf("charset="));
//AutoCharset = AutoCharset.Replace("charset=", "");
//AutoCharset = AutoCharset.Substring(0, AutoCharset.IndexOf("\"")); ////charset编码读取结果
//Encoding AutoEncoding = Encoding.GetEncoding(AutoCharset);
//result = AutoEncoding.GetString(SourceCode); //return result;
}
}
}
catch (Exception ex)
{
MessageBox.Show("GetURL Error!" + Environment.NewLine + ex.Message);
//错误返回标识
return "error";
}
}
}httpwebrequest编码
由于每个网页的编码方式不一样,可能是utf-8,gbk,gb2312等,所以
1)首先以默认编码方式获取源代码字符串(可能存在识别错误,中文无法显示)
2)在1中寻找charset关键字,后面跟的是编码方式,获取之
3)用2中获得的编码方式再次重新正确的解析源代码字符串但是现在碰到个问题,程序在30行时会报错,“流不可读”,请问这个怎么解决呢?
由于这个类要被循环利用,所以不希望两次Get网页源代码,一次用于识别编码,一次正确翻译,只希望读一次就解析出正确的源代码,求大神帮忙看看,怎么改才好?另外,37-50是我写的另一种方法,但是发现获得的网页源代码会被莫名其妙的截断,只能显示开头的一部分,后面都会丢失,小白在这里求教了
static class HTTP_Interaction
{
static public string GetURL(string strURL, string cookie)
{
try
{
HttpWebRequest wr = (HttpWebRequest)HttpWebRequest.Create(strURL);
if (cookie != "")
{
wr.Headers["cookie"] = cookie; //设置cookie
}
using (HttpWebResponse wsp = (HttpWebResponse)wr.GetResponse())
{
using (Stream st = wsp.GetResponseStream())
{
//默认编码读取结果
Encoding DefaultCharset = Encoding.Default; //默认编码
StreamReader sr = new StreamReader(st, DefaultCharset);
string result = sr.ReadToEnd();
sr.Close(); //获得charset编码格式
string AutoCharset = "";
AutoCharset = result.Substring(result.IndexOf("charset="));
AutoCharset = AutoCharset.Replace("charset=", "");
AutoCharset = AutoCharset.Substring(0, AutoCharset.IndexOf("\"")); //charset编码读取结果
Encoding AutoEncoding = Encoding.GetEncoding(AutoCharset);
StreamReader sr2 = new StreamReader(st, DefaultCharset);
result = sr2.ReadToEnd();
sr2.Close(); return result;
////读取二进制编码
//byte[] SourceCode = new byte[50 * 1024];
//st.Read(SourceCode, 0, SourceCode.Length); ////默认编码读取结果
//Encoding DefaultCharset = Encoding.Default; //默认编码
//string result = DefaultCharset.GetString(SourceCode); ////获得charset编码格式
//string AutoCharset = "";
//AutoCharset = result.Substring(result.IndexOf("charset="));
//AutoCharset = AutoCharset.Replace("charset=", "");
//AutoCharset = AutoCharset.Substring(0, AutoCharset.IndexOf("\"")); ////charset编码读取结果
//Encoding AutoEncoding = Encoding.GetEncoding(AutoCharset);
//result = AutoEncoding.GetString(SourceCode); //return result;
}
}
}
catch (Exception ex)
{
MessageBox.Show("GetURL Error!" + Environment.NewLine + ex.Message);
//错误返回标识
return "error";
}
}
}httpwebrequest编码
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货