
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
namespace Zxq.Common
{
//郑希强
//www.cnblogs.com/zhengxiqiang
//生成静态页操作
//2009.2
public class ToHtml
{
#region 读取模板
/// <summary>
/// 读取模板
/// </summary>
/// <param name="templateUrl">模板地址</param>
/// <param name="coding">编码</param>
/// <returns>模板内容</returns>
public string ReadTemplate(string templateUrl, Encoding code)
{
string tlPath = System.Web.HttpContext.Current.Server.MapPath(templateUrl);
StreamReader sr = null;
string str = null;
//读取模板内容
try
{
sr = new StreamReader(tlPath, code);
str = sr.ReadToEnd();
}
catch (Exception ex)
{
throw ex;
}
finally
{
sr.Close();
}
return str;
}
#endregion
#region 生成文件
/// <summary>
/// 生成文件
/// </summary>
/// <param name="str">文件内容</param>
/// <param name="htmlFile">文件存放地址</param>
/// <param name="fileName">文件名</param>
/// <param name="coding">编码</param>
/// <returns>文件名</returns>
public bool CreateHtml(string str, string htmlFile, string fileName, Encoding code)
{
StreamWriter sw = null;
bool a = false;
//写入生成
try
{
htmlFile = System.Web.HttpContext.Current.Server.MapPath(htmlFile);
this.FolderCreate(htmlFile);
sw = new StreamWriter(htmlFile + fileName, false, code);
sw.Write(str);
sw.Flush();
a = FileExists(htmlFile + fileName);
}
catch (Exception ex)
{
throw ex;
}
finally
{
sw.Close();
}
return a;
}
#endregion
#region 判断文件是否存在
/// <summary>
/// 判断文件是否存在
/// </summary>
/// <param name="FilePath">文件路径</param>
/// <returns></returns>
public bool FileExists(string FilePath)
{
if (System.IO.File.Exists(FilePath))
return true;
else
return false;
}
#endregion
#region 创建目录
/// <summary>
/// 创建目录
/// </summary>
/// <param name="Path"></param>
/// <returns></returns>
public bool FolderCreate(string Path)
{
// 判断目标目录是否存在如果不存在则新建之
if (!FolderExists(Path))
Directory.CreateDirectory(Path);
return FolderExists(Path);
}
#endregion
#region 判断目录是否存在
/// <summary>
/// 判断目录是否存在
/// </summary>
/// <param name="Path">路径</param>
/// <returns></returns>
public bool FolderExists(string Path)
{
if (Directory.Exists(Path))
return true;
else
return false;
}
#endregion
#region 静态列表页分页
/// <summary>
/// 静态列表页分页
/// </summary>
/// <param name="pageCount">总页数</param>
/// <param name="currentPage">当前页</param>
/// <param name="prefix">如:list</param>
/// <param name="suffix">如:.shtml</param>
/// <returns></returns>
public string GetHtmlPager(int pageCount, int currentPage, string prefix, string suffix)
{
int stepNum = 4;
int pageRoot = 1;
pageCount = pageCount == 0 ? 1 : pageCount;
currentPage = currentPage == 0 ? 1 : currentPage;
StringBuilder sb = new StringBuilder();
sb.Append("<ul>");
sb.Append("<li class=pagerTitle> 分页 " + currentPage.ToString() + "/" + pageCount.ToString() + " </li>\r");
if (currentPage - stepNum < 2)
pageRoot = 1;
else
pageRoot = currentPage - stepNum;
int pageFoot = pageCount;
if (currentPage + stepNum >= pageCount)
pageFoot = pageCount;
else
pageFoot = currentPage + stepNum;
if (pageRoot == 1)
{
if (currentPage > 1)
{
sb.Append("<li> <a href='" + prefix + "1" + suffix + "' title='首页'>首页</a> </li>\r");
sb.Append("<li> <a href='" + prefix + Convert.ToString(currentPage - 1) + suffix + "' title='上页'>上页</a> </li>\r");
}
}
else
{
sb.Append("<li> <a href='" + prefix + "1" + suffix + "' title='首页'>首页</a> </li>");
sb.Append("<li> <a href='" + prefix + Convert.ToString(currentPage - 1) + suffix + "' title='上页'>上页</a> </li>\r");
}
for (int i = pageRoot; i <= pageFoot; i++)
{
if (i == currentPage)
{
sb.Append("<li class='current'> " + i.ToString() + " </li>\r");
}
else
{
sb.Append("<li> <a href='" + prefix + i.ToString() + suffix + "' title='第" + i.ToString() + "页'>" + i.ToString() + "</a> </li>\r");
}
if (i == pageCount)
break;
}
if (pageFoot == pageCount)
{
if (pageCount > currentPage)
{
sb.Append("<li> <a href='" + prefix + Convert.ToString(currentPage + 1) + suffix + "' title='下页'>下页</a> </li>\r");
sb.Append("<li> <a href='" + prefix + pageCount.ToString() + suffix + "' title='尾页'>尾页</a> </li>\r");
}
}
else
{
sb.Append("<li> <a href='" + prefix + Convert.ToString(currentPage + 1) + suffix + "' title='下页'>下页</a> </li>\r");
sb.Append("<li> <a href='" + prefix + pageCount.ToString() + suffix + "' title='尾页'>尾页</a> </li>\r");
}
sb.Append("</ul>");
return sb.ToString();
}
#endregion
#region 压缩Html文件
/// <summary>
/// 压缩Html文件
/// </summary>
/// <param name="html">Html文件</param>
/// <returns></returns>
public string ZipHtml(string Html)
{
Html = Regex.Replace(Html, @">\s+?<", "><");//去除Html中的空白字符.
Html = Regex.Replace(Html, @"\r\n\s*", "");
Html = Regex.Replace(Html, @"<body([\s|\S]*?)>([\s|\S]*?)</body>", @"<body$1>$2</body>", RegexOptions.IgnoreCase);
return Html;
}
#endregion
#region 从HTML中获取文本,保留br,p,img
/// <summary>
/// 从HTML中获取文本,保留br,p,img
/// </summary>
/// <param name="Html">文本内容</param>
/// <returns></returns>
public string GetTextFromHtml(string Html)
{
Regex regEx = new Regex(@"</?(?!br|/?p|img)[^>]*>", RegexOptions.IgnoreCase);
return regEx.Replace(Html, "");
}
#endregion
}
}
posted @ 2009-07-04 10:27
郑希强 阅读(4044)
评论(56) 编辑 收藏 所属分类:
ASP.NET
发表评论
压缩html还需要多一点判断...比如<pre标记..
谁说生成静态页能够利于搜索引擎啊,懂一点技术的就知道这是很明显的误导啊。
公司系统一直用生成html页面,使用时间长了就会发现问题多的不是就那几点。
楼主所列的只是涉及到怎么生成一个静态实体文件以及分页代码
前几天做了一个生成静态页的CMS,由于初级接触生成静态页,遇到诸多问题.一直不得其解,最后感觉实在很糟,改伪静态了.问题如下:
1.生成文件不难.重要的模板内的标签管理.. dedecms无奈是PHP,一直没太搞懂里面的标签原理(例如在模板标签内定义列表数.列表方式)
2.一触而动全身(比如添加分类.那么内容页必须全部更新才能同步).感觉没有URL重写来得爽. //当然这点似乎所有以静态页发布的CMS都必须这样..
3.关于"有利于搜索引擎"这点来说.这跟服务器响应速度是有很大关系的.比如请求同一页面.如果response end时间过长.这页被引擎索引的机率确实会相对小.如果用静态页.相对来说.晌应时间要稍短..所以...这个"有利于"是相对的.
<<<楼主如果有兴趣的话写写第一问里面的内容!!继续关注你>>>
#8楼[
楼主]2009-07-04 12:15 |
--引用--------------------------------------------------
Jeffrey Zhao: 谁说生成静态页能够利于搜索引擎啊,懂一点技术的就知道这是很明显的误导啊。
--------------------------------------------------------
静态页是容易被搜索引擎收录的啊!学习下SEO这方面知识都能知道的啊
@二德子
新浪搜狐都是用的静态页技术也没啥问题,网站要是做大了,静态页技术是必须的。
想问下博主像Shopping Cart这种需要Session或Cookies的如何处理呢?
--引用--------------------------------------------------
郑希强: --引用--------------------------------------------------
Jeffrey Zhao: 谁说生成静态页能够利于搜索引擎啊,懂一点技术的就知道这是很明显的误导啊。
--------------------------------------------------------
静态页是容易被搜索引擎收录的啊!学习下SEO这方面知识都能知道的啊
--------------------------------------------------------
呵呵,那都是相当旧的观点了,静态页从本质上讲跟动态的并没有区别,尤其是对搜索引擎来说
是静态URL是有利于SEO的,但权重很少。
要做好SEO,关键是Meta信息,标题h1,标题title,和关键字分布频率
--引用--------------------------------------------------
Ray Wu: --引用--------------------------------------------------
郑希强: --引用--------------------------------------------------
Jeffrey Zhao: 谁说生成静态页能够利于搜索引擎啊,懂一点技术的就知道这是很明显的误导啊。
--------------------------------------------------------
静态页是容易被搜索引擎收录的啊!学习下SEO这方面知识都能知道的啊
--------------------------------------------------------
呵呵,那都是相当旧的观点了,静态页从本质上讲跟动态的并没有区别,尤其是对搜索引擎来说
--------------------------------------------------------
确实,老赵说的也没错,动态、静态现在本质上已经没区别了,只是相对而言静态比动态请求响应要稍快,无论是对用户还是SE来说友好度要高一些,所以还是有一定好处,但只要动态请求响应不是太慢,实际所所占权重确实较小。
#14楼[
楼主]2009-07-04 14:12 |
@Sam Lin
要权重高的话:最好是原创内容和Pr值高的外链
感觉搜索引擎对meta 的关键词和内容 都忽略了
这年头还做生成静态,汗。
page.aspx?id=888 只是参数不利于搜索。
现在都是 url 重写就OK了。
如: page/888.htm
生成静态,简直就是硬盘杀手。
10条记录就是10万个文件?
维护上面呢?网站界面更新呢?
@xixixi
“10条记录就是10万个文件?”
为什么这样说呢?
@郑希强
--引用--------------------------------------------------
Jeffrey Zhao: 谁说生成静态页能够利于搜索引擎啊,懂一点技术的就知道这是很明显的误导啊。
--------------------------------------------------------
静态页是容易被搜索引擎收录的啊!学习下SEO这方面知识都能知道的啊
-------------------
老兄,对于搜索引擎来说,不管你是动态还是静态服务器返回给蜘蛛的结果都是一样的!
还是搞技术的,别说这样的话吧,你还嫩得很!
#19楼[
楼主]2009-07-04 15:51 |
@缘易姿姿
我一直都是以为静态页容易收录!错了可以改了喽
懂点技术的未必就知道,标榜正义未必就是正确的。稍微有点SEO经验的都晓得,有些站生成静态页的好处比伪静态确实要好,比如小说站。
其实url的优化只是一点而已,静态,伪静态的取舍要看实际情况,访问量大,变化较小的页面生成静态,内页数据更新频率高的用伪静态。看老赵,还有 缘易姿姿 这种苛刻的语气很不舒服,顶楼主。
那是上个世纪的事了,本世纪如果搜索引擎不能完美支持动态网站,那就可以直接下线了。
晕了,还没自己做生成静态页面。不过应该还是有好处的吧,关键还是看网站内容,内容为王嘛。
看代码好熟悉,看自己的ToHtml发现居然很多相同的
看来这个问题有混淆的人还是不少,我完整地写一篇文章吧。
--------
不可能完美。动态页面再牛都不如静态页面对搜索引擎友好
是分不清,但是动态页面乱糟糟的参数,蜘蛛有点讨厌。
@私家侦探
看来还是需要解释一下不可了,你把两个不同的概念混淆起来了。
对于搜索引擎收录,静态页面更容易被收录吧。第一静态页面返回快,蜘蛛喜欢。第二静态页面url中的关键字容易做得好(特别是英文站),蜘蛛也喜欢。
虽然现在动态页面可以做伪url,但毕竟还不如纯静态强悍吧,就返回速度和url中的关键字来说
#34楼[
楼主]2009-07-04 22:55 |
当然是不是被收录还有其它很多原因,比如内容以及内容中的关键字安排。但是我们现在谈的是url关键字优化和返回速度。
@郑希强
你觉得你现在做的,和这些文章说的是一回事情吗?
你把两个概念混淆了啊。
老赵,你直接写篇文章阐述这两个概念。光说混淆,没人能接受,要给人理解,心服。
传说:"动态网址不能被抓取。"
事实:我们可以抓取动态网址并且解释不同的参数。如果您为了让网址看起来像是静态的,而隐藏那些可以给谷歌提供有价值信息的参数,这样做反而会给该网址的抓取和排名带来麻烦。我们的建议是:请不要将一个动态网址改换格式以使其看起来是静态的。尽可能地使用静态网址来显示静态内容是可取的,但在您决定展示动态内容的情况下,请不要将参数隐藏起来从而使他们看起来像是静态的,因为这样做会删除掉那些有助于我们分析网址的有用信息。
传说:"动态网址的参数要少于3个。"
事实:对于参数的数量是没有限制的。但是,一个好的经验是不要让您的网址太长(这个适用于所有的网址,不论是静态的还是动态的)。您可以去掉一些对于 Googlebot 来说不重要的参数,给用户一个好看一点的动态网址。如果您不能确定可以去掉哪些参数,我们建议您将动态网址中所有的参数都提供给我们,我们的系统会弄明白哪一些是不重要的。将参数隐藏起来会影响我们正确地分析您的网址,我们也就不能识别这些参数,一些重要信息可能也因此丢失了。
我最近的测试中静态链接要明显好于动态页面,即使gg官方说动态静态无区别,奉劝各位做互联网的还是要静态,至少看起来像静态,在接触的一些专职SEOER中,也是强烈建议静态化
@Keep Walking
SEO是一个实践性的活,我见过太多扯蛋的专业SEOer了。
是否专业,唯一考察的结果就是SEO效果。
顺便发布一个广告:现在想找个SEOer对我的blog进行SEO优化……自然不会是无偿的。
@Jeffrey Zhao
呵呵,也许吧,it168和赶集都花大笔钱养些废物?
我的站点动态页面收录和排名明显比静态页面要低很多,你可以长期观察观察
@Keep Walking
你咋就对号入座了?我又没有说谁,我也不认识赶集阿it168什么的,我只是说我见过很多扯蛋的SEOer。
至于你的站点是什么?影响SEO排名的因素有很多,你为什么说是静态地址和动态地址的原因呢?
Jeffrey Zhao
别怪别人扯蛋,只怪自己无知
@seoer
说不定seoer的名声就是被你这样的seoer搞臭的,嘿嘿。
具体表现为:就只是讲一些人人明白的大道理,但是没有办法通过自己的成果展现出来。
概括起来就是“光会耍嘴皮子”。
Keep Walking
it168的技术怎么就成废物呢,
您可得好好说说
静态页相对于动态页是没有什么大的优势的,请看这篇google的官方说法:
http://googlechinablog.com/2008/10/blog-post_20.html
说实话,这种生成静态页面的方式很过时!这种只能满足整页面缓存,如果我只是一小部分数据变动又得重新生成页面,如 访问量/评论数 相关文章等信息(别说用iframe看起来不爽)。这样一来静态页面实际上没有多大意义了,根本无法满足实际的需求。另外维护特别不方便,某天需要更改url规则你怎么办?些url重写规则?
建议楼主看一下这篇Ruby on Rails的缓存介绍
http://guides.rubyonrails.org/caching_with_rails.html
生成是必要的。不管是否利于搜索体验。
但是,如果对于小站,生成静态页面和使用带问号的动态页面的收录效果相差是非常大的。
况且,生成静态的页面也许对磁盘 IO 是有影响,但是对于大站什么来说,这是最基本的。特别是页面里很多地方需要读取数据库的情况下。
呵呵,还有你说的几个问题,我觉得你并没有做大站的经验。
博主:
你好! 我是初学.net的 刚才看了你的“生成静态页核心代码 ” 有点迷迷糊糊的 你能不能把完整的实例发下给我啊? 我邮箱是zhu871209@163.com 非常感谢!
楼主可以提供完整的示例代码吗,急用,谢谢了,我邮箱是hushenhaowoaini@hotmail.com