无视网页编码获得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 "";

        }


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013542549/article/details/77542106

html网页的代码大全

  • 2013年10月24日 20:46
  • 31KB
  • 下载

网页html代码存入数据库引号斜杠换行符号等SQL编码处理

  • 2013年06月02日 10:29
  • 907B
  • 下载

数据库编码

查看数据的编码: 方法一:status 方法二:show variables like ‘character%’; 通过方法二可以看到数据库中常见的几种编码类型: (1)character_s...
  • zxl1033394132
  • zxl1033394132
  • 2016-08-24 22:53:24
  • 428

textarea中换行符存入数据库中为\r\n原因

在网页开发中,有时发现textarea中输入的换行符存入数据库中变成了\r\n而不是换行符,这是由于在读取textarea中的数据的时候,先把他们转换为了字符串然后存入的数据库,那么换行符就会被译成\...
  • lovenkcs
  • lovenkcs
  • 2015-05-07 22:14:36
  • 3534

保存html内容到数据库

一、获取页面的html内容 //本例使用jquery var htmlContent = $("html").html(); 如果页面是放在iframe里的,如下用法 frameId是iframe元素...
  • jjavaboy
  • jjavaboy
  • 2015-01-06 10:53:42
  • 12089

获取html页面的编码

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

C# HttpHelper类

  • 2011年12月08日 16:47
  • 3KB
  • 下载

powerdesigner中去掉生成sql中的引号

菜单:Database-> Edit Current DBMS...-> Script-> Sql-> Format-> CaseSensitivityUsingQuote 改为no。搞定!!--po...
  • casablancas
  • casablancas
  • 2006-06-07 19:03:00
  • 835

怎样把输入的文本转换成html代码存入数据库啊

///   /// 替换html中的特殊字符  ///   /// 需要进行替换的文本。  /// 替换完的文本。  public string HtmlEncode(string theString...
  • GoodShot
  • GoodShot
  • 2010-11-30 11:42:00
  • 6911

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

有些时候打开一个html页面,发现显示中文乱码。于是在浏览器==》工具==》编码中修改默认的编码方式。但每次打开页面都需要修改编码,实在是太麻烦。其实只需要在你的html页面的标签内添加下面一行代码就...
  • keketrtr
  • keketrtr
  • 2015-07-28 17:18:50
  • 2627
收藏助手
不良信息举报
您举报文章:无视网页编码获得Html的一个方法
举报原因:
原因补充:

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