无视网页编码获得Html的一个方法

原创 2017年08月24日 21:07:12


最近在写一个比较简单的分布式爬虫,爬取的网页编码各式各样,所以写出了一套方法,用来获取Html



下面上代码



/// <summary>
        /// 获取网页编码并输出内容
        /// </summary>
        /// <param name="url">url</param>
        /// <param name="encode">回传编码</param>
        /// <returns>html</returns>
        public static string GetDataFromUrl(string url, ref Encoding encode)
        {

            try
            {
                string str = string.Empty;
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                //设置http头
                request.AllowAutoRedirect = true;
                request.AllowWriteStreamBuffering = true;
                request.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19";
                request.Method = "GET";
                request.Timeout = 10 * 1000;
                HttpWebResponse response = null;
                response = (HttpWebResponse)request.GetResponse();

                //根据http应答的http头来判断编码
                string characterSet = response.CharacterSet;
                //Encoding encode;
                if (characterSet != "")
                {
                    if (characterSet == "ISO-8859-1")
                    {
                        characterSet = "gb2312";
                    }
                    encode = Encoding.GetEncoding(characterSet);
                }
                else
                {
                    encode = Encoding.Default;
                }
                //声明一个内存流来保存http应答流
                Stream receiveStream = response.GetResponseStream();
                MemoryStream mStream = new MemoryStream();
                byte[] bf = new byte[255];
                int count = receiveStream.Read(bf, 0, 255);
                while (count > 0)
                {
                    mStream.Write(bf, 0, count);
                    count = receiveStream.Read(bf, 0, 255);
                }
                receiveStream.Close();
                mStream.Seek(0, SeekOrigin.Begin);
                //从内存流里读取字符串
                StreamReader reader = new StreamReader(mStream, encode);
                char[] buffer = new char[1024];
                count = reader.Read(buffer, 0, 1024);
                while (count > 0)
                {
                    str += new String(buffer, 0, count);
                    count = reader.Read(buffer, 0, 1024);
                }
                //从解析出的字符串里判断charset,如果和http应答的编码不一直
                //那么以页面声明的为准,再次从内存流里重新读取文本
                Regex reg =
                   new Regex(@"<meta[\s\S]+?charset=(.*?)""[\s\S]+?>",
                              RegexOptions.Multiline | RegexOptions.IgnoreCase);
                MatchCollection mc = reg.Matches(str);
                if (mc.Count > 0)
                {
                    string tempCharSet = mc[0].Result("$1");
                    if (string.Compare(tempCharSet, characterSet, true) != 0)
                    {
                        encode = Encoding.GetEncoding(tempCharSet);
                        str = string.Empty;
                        mStream.Seek(0, SeekOrigin.Begin);
                        reader = new StreamReader(mStream, encode);
                        buffer = new char[255];
                        count = reader.Read(buffer, 0, 255);
                        while (count > 0)
                        {
                            str += new String(buffer, 0, count);
                            count = reader.Read(buffer, 0, 255);
                        }
                    }
                }
                reader.Close();
                mStream.Close();
                if (response != null)
                    response.Close();
                return str;
            }
            catch (Exception ex)
            {
                if (s)
                {
                    Console.WriteLine(ex.Message);
                    StreamWriter st = new StreamWriter("err.dst", true);
                    st.WriteLine(url);
                    st.WriteLine(ex.ToString());
                    st.Close();
                    s = false;
                    //System.Threading.Thread.Sleep(100000);
                    GetDataFromUrl(url, ref encode);
                }
            }
            return "";

        }


版权声明:本文为博主原创文章,未经博主允许不得转载。

获取html页面的编码

     html页面一般都会指定一个编码,如何获取到是处理html页面的第一步,因为错误的编码必然带来后面处理的问题。这里我用python的正则表达式写了个:import rea = ["",   ...
  • zhaoweikid
  • zhaoweikid
  • 2007年07月02日 17:19
  • 3380

当html页面乱码需要修改编码时

有些时候打开一个html页面,发现显示中文乱码。于是在浏览器==》工具==》编码中修改默认的编码方式。但每次打开页面都需要修改编码,实在是太麻烦。其实只需要在你的html页面的标签内添加下面一行代码就...
  • keketrtr
  • keketrtr
  • 2015年07月28日 17:18
  • 2340

网页中常用标签的编码HTML

ASCII中部分实体的新名字 显示 描述 ...
  • jk6801251
  • jk6801251
  • 2007年11月21日 13:59
  • 798

URL和HTML编码

URL和HTML编码在呈现HTML页面时,有时候需要显示一些特殊的字符,例如”下面举三个例子分别说明如何在HTML和URL中显示这些特殊字符,以及如何显示当前页面的源代码.使用Server.HtmlE...
  • dreamliner
  • dreamliner
  • 2008年05月08日 19:00
  • 2043

异步任务AsyncTask使用

Android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕绘图事件等,因此其他操作不应该、也不能阻塞UI线程,否则UI界面将会停止响应,引发ANR(Application Not Resp...
  • linzhuowei0775
  • linzhuowei0775
  • 2015年09月12日 20:27
  • 262

html页面设置成中文编码(UTF-8)

  • yhj19920417
  • yhj19920417
  • 2015年11月05日 16:40
  • 987

【垂直搜索引擎搭建11】使用htmlparser获取页面的字符编码encoding

1,确定目标。对于html页面来说,一般都有确定编码的语句:可以通过这一行的特征来取出网页的编码。2,选出特征。      1)它是meta标签       2)具有http-equiv属性值为Co...
  • kevinelstri
  • kevinelstri
  • 2016年08月24日 17:04
  • 510

网页编码就是那点事( ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)

编码一直是让新手头疼的问题,特别是 GBK、GB2312、UTF-8 这三个比较常见的网页编码的区别,更是让许多新手晕头转向,怎么解释也解释不清楚。但是编码又是那么重要,特别在网页这一块。如果你打出来...
  • s_jobs
  • s_jobs
  • 2012年11月19日 09:24
  • 3301

判断网页的编码方式 python

在学习python爬取网页的时候,我们经常会遇到编码方式的困扰,为了解决这个编码方式的问题,首先是要获取网页的编码方式,下面就获取网页的编码方式重点说一下三种方法。一, 使用urllib模块的getp...
  • Winterto1990
  • Winterto1990
  • 2015年08月14日 11:09
  • 3607

教你写一个简单的网页(html网页开发入门)

一些基本的html知识
  • qq_33351410
  • qq_33351410
  • 2016年07月14日 16:08
  • 10344
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无视网页编码获得Html的一个方法
举报原因:
原因补充:

(最多只允许输入30个字)