asp.net 利用HttpWebRequest自动获取网页编码并获取网页源代码

简介: /// /// 获取源代码 /// /// /// public static string GetHtml(string url,...
     /// <summary>
    /// 获取源代码
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public static string GetHtml(string url, Encoding encoding)
    {
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        StreamReader reader = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(url);
            request.Timeout = 20000;
            request.AllowAutoRedirect = false;

            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
            {
                if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                    reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress), encoding);
                else
                    reader = new StreamReader(response.GetResponseStream(), encoding);
                string html = reader.ReadToEnd();

                return html;
            }
        }
        catch
        {
        }
        finally
        {

            if (response != null)
            {
                response.Close();
                response = null;
            }
            if (reader != null)
                reader.Close();

            if (request != null)
                request = null;

        }

        return string.Empty;
    }

    public static string GetEncoding(string url)
    {
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        StreamReader reader = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(url);
            request.Timeout = 20000;
            request.AllowAutoRedirect = false;

            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
            {
                if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                    reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
                else
                    reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);

                string html = reader.ReadToEnd();

                Regex reg_charset = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
                if (reg_charset.IsMatch(html))
                {
                    return reg_charset.Match(html).Groups["charset"].Value;
                }
                else if (response.CharacterSet != string.Empty)
                {
                    return response.CharacterSet;
                }
                else
                    return Encoding.Default.BodyName;
            }
        }
        catch
        {
        }
        finally
        {

            if (response != null)
            {
                response.Close();
                response = null;
            }
            if (reader != null)
                reader.Close();

            if (request != null)
                request = null;

        }
    }



下面是获取网页标题的

 using System; 
 using System.Net; 
 using System.Text; 
 using System.Text.RegularExpressions; 
  
 class Program 
 { 
   // 获取网页的HTML内容,根据网页的charset自动判断Encoding 
   static string GetHtml(string url) 
   { 
     return GetHtml(url, null); 
   } 
  
   // 获取网页的HTML内容,指定Encoding 
   static string GetHtml(string url, Encoding encoding) 
   { 
     byte[] buf = new WebClient().DownloadData(url); 
     if (encoding != null) return encoding.GetString(buf); 
     string html = Encoding.UTF8.GetString(buf); 
     encoding = GetEncoding(html); 
     if (encoding == null || encoding == Encoding.UTF8) return html; 
     return encoding.GetString(buf); 
   } 
  
   // 根据网页的HTML内容提取网页的Encoding 
   static Encoding GetEncoding(string html) 
   { 
     string pattern = @"(?i)\bcharset=(? <charset>[-a-zA-Z_0-9]+)"; 
     string charset = Regex.Match(html, pattern).Groups["charset"].Value; 
     try { return Encoding.GetEncoding(charset); } 
     catch (ArgumentException) { return null; } 
   } 
  
   // 根据网页的HTML内容提取网页的Title 
   static string GetTitle(string html) 
   { 
     string pattern = @"(?si) <title(?:\s+(?:""[^""]*""|'[^']*'|[^""'>])*)?>(? <title>.*?) </title>"; 
     return Regex.Match(html, pattern).Groups["title"].Value.Trim(); 
   } 
  
   // 打印网页的Encoding和Title 
   static void PrintEncodingAndTitle(string url) 
   { 
     string html = GetHtml(url); 
     Console.WriteLine("[{0}] [{1}]", GetEncoding(html), GetTitle(html)); 
   } 
  
   // 程序入口 
   static void Main() 
   { 
     PrintEncodingAndTitle("http://www.msdn.net/"); 
     PrintEncodingAndTitle("http://www.cnblogs.com/"); 
     PrintEncodingAndTitle("http://www.cnblogs.com/skyiv/"); 
     PrintEncodingAndTitle("http://www.csdn.net/"); 
     PrintEncodingAndTitle("http://news.163.com/"); 
   } 
 } 
 /* 程序输出: 
 [] [MSDN: Microsoft Developer Network] 
 [System.Text.UTF8Encoding] [博客园 - 程序员的网上家园] 
 [System.Text.UTF8Encoding] [空间/IV - 博客园] 
 [System.Text.UTF8Encoding] [CSDN.NET - 中国最大的IT技术社区,为IT专业技术人员提供最全面的信息传播和服务平台] 
 [System.Text.DBCSCodePageEncoding] [新闻中心_网易新闻] 
 */




相关文章
|
6月前
|
JSON IDE 前端开发
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
|
12月前
|
网络协议 算法 Shell
来我们探究一下net/http 的代码流程
来我们探究一下net/http 的代码流程
|
3月前
|
API
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
|
3月前
|
C# 开发者 Windows
在VB.NET项目中使用C#编写的代码
在VB.NET项目中使用C#编写的代码
52 0
|
23天前
|
前端开发 JavaScript C#
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
|
2月前
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
111 6
|
3月前
|
Kubernetes 监控 Devops
【独家揭秘】.NET项目中的DevOps实践:从代码提交到生产部署,你不知道的那些事!
【8月更文挑战第28天】.NET 项目中的 DevOps 实践贯穿代码提交到生产部署全流程,涵盖健壮的源代码管理、GitFlow 工作流、持续集成与部署、容器化及监控日志记录。通过 Git、CI/CD 工具、Kubernetes 及日志框架的最佳实践应用,显著提升软件开发效率与质量。本文通过具体示例,助力开发者构建高效可靠的 DevOps 流程,确保项目成功交付。
73 0
|
3月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
99 1
|
3月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
|
3月前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)

相关实验场景

更多