首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • [散分分享代码]HttpWebRequest获取网页源代码时自动识别网页编码 [已结帖,结帖人:iuhxq]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-21 07:29:16 楼主
    C# code
    /// <summary> /// 获取源代码 /// </summary> /// <param name="url"></param> /// <returns></returns> 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; }



    GetEncoding方法请查看:GetEncoding
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wuyi8808
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 07:40:111楼 得分:5
    sf
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wuyi8808
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 07:43:312楼 得分:5
    和我这个似乎是异曲同工的:
    http://www.cnblogs.com/skyiv/archive/2008/06/08/1215983.html
    :)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wuyi8808
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 07:45:013楼 得分:5
    C# code
    // 根据URL提取页面的Title,根据网页的charset自动判断Encoding 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] [新闻中心_网易新闻] */
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 07:54:554楼 得分:0
    @空军

    你这个能读取gzip编码的页面吗?比如google的网页
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • findcaiyzh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 07:57:115楼 得分:5
    大猩猩们果然不一般:)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yagebu1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:06:596楼 得分:4
    收藏!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wuyi8808
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:12:477楼 得分:4
    引用 4 楼 iuhxq 的回复:
    你这个能读取gzip编码的页面吗?比如google的网页


    C# code
    // 试了一下 google 的网页 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; } } // 程序入口 static void Main() { Console.WriteLine(GetHtml("http://www.google.com")); } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wuyi8808
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:13:088楼 得分:4
    <html> <head> <meta http-equiv="content-type" content="text/html; charset=GB2312"> <title>Google </title> <style>body,td,a,p,.h{font-family:arial,sans-serif}.h{font-size:20px}.h{color:#3366cc}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}.lnc:link,.lnc:visited{color:#00c}.pgtab,.pgtab:hover,.pgtabselected,.pgtabside{text-align:center;text-decoration:none;color:#00c;display:block;height:27px;float:left;overflow:hidden;background:url(/intl/ja/images/productlinktabs.png) no-repeat;padding-top:8px}.pgtab{width:130px;background-position:-274px 0}.pgtab:hover{width:130px;background-position:-144px 0}.pgtabselected{width:144px}.pgtabside{width:3px;background-position:-404px 0}.iconl{overflow:hidden;height:px;width:px;position:relative}#gbar{height:22px;padding-left:2px}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#gbi,#gbs{background:#fff;left:0;position:absolute;top:24px;visibility:hidden;z-index:1000}#gbi{border:1px solid;border-color:#c9d7f1 #36c #36c #a2bae7;z-index:1001}#guser{padding-bottom:7px !important}#gbar,#guser{font-size:13px;padding-top:1px !important}@media all{.gb1,.gb3{height:22px;margin-right:.73em;vertical-align:top}#gbar{float:left}}.gb2{display:block;padding:.2em .5em}a.gb1,a.gb2,a.gb3{color:#00c !important}.gb2,.gb3{text-decoration:none}a.gb2:hover{background:#36c;color:#fff !important} </style> <script>window.google={kEI:"YrKsSKT-LovU6gON1d1E",kEXPI:"17259,17735,18471,18563",kHL:"zh-CN"};
    function sf(){document.f.q.focus()}
    window.gbar={};(function(){var b=window.gbar,f,h;b.qs=function(a){var c=window.encodeURIComponent&&(document.forms[0].q||"").value;if(c)a.href=a.href.replace(/([?&])q=[^&]*|$/,function(i,g){return(g||"&")+"q="+encodeURIComponent(c)})};function j(a,c){a.visibility=h?"hidden":"visible";a.left=c+"px"}b.tg=function(a){a=a||window.event;var c=0,i,g=window.navExtra,d=document.getElementById("gbi"),e=a.target||a.srcElement;a.cancelBubble=true;if(!f){f=document.createElement(Array.every||window.createPopup?"iframe":"div");f.frameBorder="0";f.src="#";d.parentNode.appendChild(f).id="gbs";if(g)for(i in g)d.insertBefore(g[i],d.firstChild).className="gb2";document.onclick=b.close}if(e.className!="gb3")e=e.parentNode;do c+=e.offsetLeft;while(e=e.offsetParent);j(d.style,c);f.style.width=d.offsetWidth+"px";f.style.height=d.offsetHeight+"px";j(f.style,c);h=!h};b.close=function(a){h&&b.tg(a)}})(); </script> </head> <body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onload="sf();if(document.images){new Image().src='/images/nav_logo3.png'}" topmargin=3 marginheight=3> <div id=gbar> <nobr> <b class=gb1>网页 </b> <a href="http://images.google.cn/imghp?hl=zh-CN&tab=wi" onclick=gbar.qs(this) class=gb1>图片 </a> <a href="http://ditu.google.cn/maps?hl=zh-CN&tab=wl" onclick=gbar.qs(this) class=gb1>地图 </a> <a href="http://news.google.cn/nwshp?hl=zh-CN&tab=wn" onclick=gbar.qs(this) class=gb1>资讯 </a> <a href="http://video.google.cn/?hl=zh-CN&tab=wv" onclick=gbar.qs(this) class=gb1>视频 </a> <a href="http://blogsearch.google.cn/?hl=zh-CN&tab=wb" onclick=gbar.qs(this) class=gb1>博客 </a> <a href="http://www.google.cn/intl/zh-CN/options/" onclick="this.blur();gbar.tg(event);return !1" class=gb3> <u style=height:22px;vertical-align:top>更多 </u> <small>&#9660; </small> </a> <div id=gbi> <a> </a> <a href="http://shenghuo.google.cn/shenghuo/?hl=zh-CN&tab=w8" onclick=gbar.qs(this) class=gb2>生活 </a> <a href="http://www.google.cn/rebang/home?hl=zh-CN&tab=w9" onclick=gbar.qs(this) class=gb2>热榜 </a> <a href="http://daohang.google.cn/?hl=zh-
    CN&tab=wA" onclick=gbar.qs(this) class=gb2>网站导航 </a> <div class=gb2> <div class=gbd> </div> </div> <a> </a> <a href="http://www.google.com/calendar/render?hl=zh-CN&tab=wc" class=gb2>日历 </a> <a href="http://picasaweb.google.com/home?hl=zh-CN&tab=wq" onclick=gbar.qs(this) class=gb2>照片 </a> <a href="http://docs.google.com/?hl=zh-CN&tab=wo" class=gb2>文档 </a> <div class=gb2> <div class=gbd> </div> </div> <a> </a> <a href="http://www.google.cn/intl/zh-CN/options/" class=gb2>更多 &raquo; </a> </div> </nobr> </div> <div class=gbh style=left:0> </div> <div class=gbh style=right:0> </div> <div align=right id=guser style="font-size:84%;padding:0 0 4px" width=100%> <nobr> <a href="/url?sa=p&pref=ig&pval=3&q=http://www.google.cn/ig/china%3Fsource%3Diglk%26hl%3Dzh-CN&usg=AFQjCNE-fPlHBZ4IREs-KKjdCDT7u-BkSw">个性化首页 </a> | <a href="https://www.google.com/accounts/Login?continue=http://www.google.cn/webhp%3Fsource%3Dg_cn&hl=zh-CN">登录 </a> </nobr> </div> <center> <br clear=all id=lgpd> <a href="/search?q=&#37;E5&#37;A5&#37;A5&#37;E8&#37;BF&#37;90&#37;E4&#37;BC&#37;9A+&#37;E8&#37;B7&#37;B3&#37;E9&#37;AB&#37;98&hl=zh-CN"> <img src=/logos/olympics08_highjump.gif width=284 height=125 border=0 alt="北京 2008" title="北京 2008"> </a> <br> <br> <form action="/search" name=f> <table cellpadding=0 cellspacing=0> <tr valign=top> <td width=25%>&nbsp; </td> <td align=center nowrap> <input name=hl type=hidden value=zh-CN> <input type=hidden name=ie value="GB2312"> <input autocomplete="off" maxlength=2048 name=q size=55 title="Google 搜索" value=""> <br> <input name=btnG type=submit value="Google 搜索"> <input name=btnI type=submit value="&nbsp;手气不错&nbsp;"> </td> <td nowrap width=25%> <font size=-1>&nbsp;&nbsp; <a href=/advanced_search?hl=zh-CN>高级搜索 </a> <br>&nbsp;&nbsp; <a href=/preferences?hl=zh-CN>使用偏好 </a> <br>&nbsp;&nbsp; <a href=/language_tools?hl=zh-CN>语言工具 </a> </font> </td> </tr> <tr> <td align=center colspan=3> <font size=-1> <span style="text-align:left"> <input id=all type=radio name=meta value="" checked> <label for=all>所有网页 &nbsp; </label> <input id=ch type=radio
    name=meta value="lr=lang_zh-CN|lang_zh-TW"> <label for=ch>中文网页 &nbsp; </label> <input id=lgr type=radio name=meta value="lr=lang_zh-CN"> <label for=lgr>简体中文网页 &nbsp; </label> <input id=cty type=radio name=meta value="cr=countryCN"> <label for=cty>中国的网页 &nbsp; </label> </span> </font> </td> </tr> </table> </form> <br> <br> <font size=-1> <a href="/intl/zh-CN/ads/">广告计划 </a> - <a href="/intl/zh-CN/about.html">Google 大全 </a> - <a href=http://www.google.com/ncr>Google.com in English </a> </font> <p> <font size=-1>&copy;2008 - <a href="/intl/zh-CN/privacy.html">隐私权 </a> - <font size=-2> <a href=http://www.miibeian.gov.cn/ target=_blank>ICP&#35777;&#21512;&#23383;B2-20070004&#21495; </a>&nbsp;&nbsp; <img src=/intl/zh-CN_cn/images/cn_icp.gif align=absmiddle width=15 height=16 alt="icp"> </font> </font> </p> </center> </body> <script>google.y={first:[]};window.setTimeout(function(){var xjs=document.createElement('script');xjs.src='/extern_js/f/CgV6aC1DThICY24gDiswCjgDLCswGDgBLA/dAfXthmxAxI.js';document.getElementsByTagName('head')[0].appendChild(xjs)},0) </script> <script>google.y.first.push(function(){window.google.ac.install(document.f,document.f.q,"",false,"关闭",true,"","")});google.xjs_ready=true </script> </html>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qlk_2007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:13:099楼 得分:4
    学习,收藏!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:17:0810楼 得分:0
    不错不错,代码精简!

    而且可以读取gzip压缩过的网页
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • C5662601
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:17:5511楼 得分:4
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangbaiwan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:18:1812楼 得分:4
    收藏
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:20:4813楼 得分:0
    不过我还有个问题。

    编码存在几个地方:
    1、页面里
    2、http头里

    你只从页面里取编码,要是页面里没有的,你的可以分析出编码吗?
    呵呵
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • greystar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:22:1514楼 得分:4
    不错
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • winflying36
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:26:5015楼 得分:4
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wuyi8808
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:28:4616楼 得分:4
    引用 13 楼 iuhxq 的回复:
    不过我还有个问题。

    编码存在几个地方:
    1、页面里
    2、http头里

    你只从页面里取编码,要是页面里没有的,你的可以分析出编码吗?


    这个倒没有考虑到,不知有没有这种网站的例子,可以试试看。 :)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:33:4717楼 得分:0
    有的,你看我另外一个站:http://745.cc

    这个站需要读取大量的页面,所以会遇到形形色色的网页。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:49:2318楼 得分:0
    我的小站http://www.svnhost.cn
    孟子的站http://dotnet.aspx.cc

    都是没有页面编码的。不过刚巧它们都是UTF-8的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • iuhxq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 08:50:4519楼 得分:0
    你试试读取http://www.51aspx.com站的源代码。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • only_endure
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:19:4020楼 得分:4
    收藏
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • MADfox1983
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 09:46:5721楼 得分:4
    mark学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • FackMan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 10:00:5322楼 得分:4
    不错~
    修改