摘要: SQL Server 数据库的高级操作(1) 批处理(2) 变量(3) 逻辑控制(4) 函数(5) 高级查询*/(1)批处理将多条SQL语句作为一个整体去编译,生成一个执行计划,然后,执行!理解批处理的关键在于"编译",对于由多条语句组成的一个批处理,如果在编译时,其中,有一条出现语法错误,将会导致编译失败!create table t(a int,b int)-- 注释-- 如果多行注释中包含了...阅读全文
posted @ 2007-04-04 10:11 简单就好 阅读(1362) 评论(4) 编辑
摘要: SQL Server 数据库的基本操作(1) 数据库的创建(2) 数据表的创建以及相关约束的指定(含临时表)(3) 数据的添/删/改(4) 数据的查询*/(0)创建数据库-- 指定数据库名称-- (注:如果数据库名中包含空格可以使用[]将其标示)create database [Super WC]-- 关于数据文件的定义on(name = Super_WC_Data, -- 逻辑名filename...阅读全文
posted @ 2007-04-04 10:09 简单就好 阅读(530) 评论(0) 编辑
 

 

 

 

 

        分页,是大家经常做的一件事,其中有一种分页是通过URL参数的传递而进行的。

              比如大家经常看到像这样的url 

http://www.xxx.com/page=1

http://www.xxx.com/page=2

http://www.xxx.com/page=3

….

利用这样URL而获取分页的数据。这里不考虑URL重写的问题。或者更好的分页方法。

下面我来告诉大家如果设置利用小旋风来抓取这样的网页。

 

下面大家来设置变量属性

URL地址: 设置你要挖掘数据url 比如说 http://www.xxx.com/page=1 但是把你要设置成变量的数字去掉,“page=1记得把1给去掉。

位置标识 设置变量名 比如http://www.xxx.com/page=1 就设置成page=,OK

起始: 设置变量的最小值

终止:设置变量的最大值

步长:设置变量的递增值"

 

这样就OK

完事。有不懂的话,联系我。第一次写教程,写的不好,忘大家见谅。

在此多谢飞狐指点。

 

 

 

 

 

                                                              

posted @ 2009-03-21 23:50 简单就好 阅读(270) 评论(0) 编辑
Google网站管理员官方博客发布了“搜索引擎优化SEO指南”,以实例阐述和讲解了搜索引擎优化的具体操作步骤。这对网站管理员来说具有很强的指导性和参考性。下面我将用一周时间把它翻译成中文,希望对一些朋友有所帮助。
你可以在这里查看《搜索引擎优化指南》全部内容。
其中包括以下内容:
  • 创建独一无二且尽量精确的页面title (本文)
  • 充分利用”description”元标识标签
  • 改善你网站URLS的结构
  • 让你的站点更易导航
  • 提供优质的内容和服务
  • 写好锚文字
  • 恰当地使用heading标题标签
  • 图片优化
  • 有效地使用robots.txt
  • 为链接添加nofollow属性的好处
  • 以恰当的方法推广你的网站
  • 使用免费的网站管理员工具
  • 充分利用网站分析工具
  • 对管理员有用的资源

欢迎来到Google的搜索引擎优化SEO向导。这个文档最初仅仅用于Google内部团队,但是我们想也许它对那些才刚刚接触搜索引擎优化(SEO)并且希望让自己的网站在用户和搜索引擎两者上都得到很好交互性的网站管理员们有所帮助,便把它发布了出来。虽然这个手册并不能告诉你任何关于如何把你的网站自动置于Google查询第一位置的秘密,但是适当地遵循下面给出的最优方案可以让搜索引擎更好的爬行和索引你网站的内容。

搜索引擎搜索常常是指对你网站的某些部分作适当的修饰。对个别访问而言这些改变或许看起来是逐渐增加的;但是和其它优化结合起来时,不管是对你网站的访问者还是在搜索引擎结果上的表现这些改变的影响都是显而易见的。也许你已经非常熟悉下面列出的一些帮助性提示,因为它们几乎是所有网页的构成元素,但你也可能不会用到其中的大部分。

搜索引擎优化学习手册——Google SEO 官方指南中文版

搜索引擎优化仅仅只会对有机搜索有效,而不会干扰Google Adwords这样的付费赞助商结果。

虽然这个指南手册包含了“搜索引擎”这个关键词,但是我们还是希望你的一切优化应该是基于你自己最初的计划和优先考虑你网站用户的浏览体验。他们才是通过搜索引擎找到你的作品,是你网站内容的主要受众。太专注于有机搜索结果上的排名并不会传达给用户最理想的结果。搜索引擎优化的作用是当你的网页出现在结果中时把你网站中最引人注目的内容展现在用户面前,并成为他们目光的焦点。

也许举个例子将更有助于我们的说明,所以我们将按照下面的指示创建一个虚拟的网站。每一个主题里我们都会尽量详细地提出涉及到的观点及一些实践经验。下面是一些关于我们将要使用的网站的背景信息:

网站/公司名:Brandon’s Baseball Cards
域名:brandonsbaseballcards.com
领域:Online-only baseball card sales, price guides, articles, and news content
网站大小:很小,至多250张网页

也许你的网站比上面提到的这人还小或者更大,提供了更多不同的内容,但是下面将讨论的优化主题将适用于几乎所有不同大小不同类型的网站。

我们希望这些指南可以为你更好的改善网站提供一些新鲜的点子,当然我们也希望在Google网站管理員帮助群组里听到你的问题、反馈和一些成功故事。

创建独一无二且尽量精确的页面title

一个标题标签要告诉用户和搜索引擎某特定网页的主题是什么。<title>标签应该放置 于HTML文档的<head>标签里。更完美的是你可以为你网站每一张网页创建一个唯一的title名称。

搜索引擎优化学习手册——Google SEO 官方指南中文版

我们这个棒球卡网站首页的标题就列出了我公司名字和三个主要关注领域。

如果你的文档出现在搜索结果页面,你title标签里的内容也同样会出现在结果的第一行(如果你不熟悉Google搜索结果结构,你可以查看这个Google工程师Matt Cutts制作的“搜索结果结构视频,或者这张Google搜索结果页面的图示”。)如果网页出现在用户查询结果里,title里的文字将会以粗体字显示。这有助于帮助用户识别你这张网页是否是他们想找的。

你首页的titile可以列出你网站或公司的名字,也可以包含其它一些信息,诸如你实体公司的地址,你们关注的领域或提供的服务。

搜索引擎优化学习手册——Google SEO 官方指南中文版

用户查询【baseball cards】

搜索引擎优化学习手册——Google SEO 官方指南中文版 

我们的首页出现在结果中,在第一行结果标题里显示了我们网站首页的title内容。(注意其中粗体字部分和用户查询关键词之间的联系)

搜索引擎优化学习手册——Google SEO 官方指南中文版

如果用户点击结果并访问这张网页,网页的title就可会出现在浏览器窗口顶部了。

为更深一层的页面命名时你需要更准确地描述这张特殊页面所关注和呈现的内容,当然你也可以在子页面的title里包含你网站或公司的名字。

搜索引擎优化学习手册——Google SEO 官方指南中文版

用户以[rarest baseball cards]为关键词查询时

搜索引擎优化学习手册——Google SEO 官方指南中文版

一张更深层次的网页(它的title对这张网页的内容来说是独一无二的)在搜索结果里的显示信息。

网页title标签很好的实践经验

  1. 精确地描述页面的内容——选择一个可以高效地容纳网页内容的主题。不过应避免:
    • 选择一个与网页内容无关的标签
    • 选择像”Untitled”或者”New Page 1″这样的默认标题。
  2. 为每一张网页创建独一无二的title标签——每一张网页都应该有一个独一无二的title,以便让Google将它和其它页面区分开来。同样需要避免:
    • 对你网站的所有页面或者一大堆页面用一个相同的title标签。
  3. 用简练但具有描述性质的title——title可以既简短又饱含信息。如果title太长,Google就会在搜索结果里只显示title的一部分。需要避免:
    • 用太长而对用户又没什么帮助的title 在title标签里胡乱地堆积不需要的关键词。

 

以上文字英文及图片版权皆归Google网站管理员博客所有。

posted @ 2008-11-14 10:54 简单就好 阅读(101) 评论(0) 编辑

前面两篇讲解了解析Html的思想个核心算法,感谢各位提出了意见。先专门列出一文作为解释:

1、ViewStates提到,“<TD 阿道夫骄傲了沙发</TD>”怎么办?这个是可以解析出来的,其中解析后节点名为“td”,而“ 阿道夫骄傲了沙发</TD”解析成了属性。

如图:

上面的图中,包含了上面提到的例子。

回复ml_dark 兄

象这种.. <div><div></div><div><div><div></div></div></div></div> 你看看你的解析结果....

解析结果如上图。

posted @ 2008-09-07 21:30 简单就好 阅读(158) 评论(0) 编辑

老田的专栏

 

 

解析Html成标签树结构以后,我们不但可以很容易取得想要的元素,同时也很容易将Html转换成对应的XML文件。但是由于代码是在公司写的,所以没有粘贴出来的可能性,所以我只能给出大概的代码流程,具体细节描述,相信各位都很容易写出来,并且写的比我好,关键的是算法实现思想。算法的关键如下:

1.         Html中每个tag都是都将作为树中的一个节点存在的,每个tag都属于树中的某一层。
2.         辅助数据结构:栈(stack)、List、HashTable。其中HashTable[i](i属于int类型)是一个List,用于临时存储第i层子Tag。
3.         顺序扫描Html文本,当遇到”<A~Z”这样的标志,表示可能是一个Tag,调用GetTag()函数对此段代码进行解析,解析出Tag名,Tag属性等等。如果返回值不为空,那么将返回值入栈。并且记录次tag的开始位置。
4.         遇到</A~Z>这样的标志,表示可能是某个Tag的结束。解析出此结束标志的Tag名。如果在栈中找到与此结束标志名同名的元素(此元素属于栈中第iLevel层),那么表示找到匹配的Tag。则Tag出栈,将HashTable[iLevel+1]到HashTable[maxLevel]中的所有元素取出作为此Tag的子节点。放入第HashTable [iLevel]中。并记录Tag的结束位置。
5.         对于<Tag>xxx</Tag>之间的字符串xxx,将其作为特殊的HtmlTextTag处理。出栈,和入栈操作与普通Tag类似。
6.         当栈为空的时候表示最后一次出栈的Tag给根节点。   由于是在公司内部开发的东西,所以不可能把源代码拿出来粘贴,所以只能把大概的代码给出。
伪代码如下:
  1. public void Parse()   
  2.   
  3. {   
  4.   
  5.     char ch = GetCurrentChar();  //取第一个字符      
  6.   
  7.     while (!Eof())   
  8.   
  9.     {   
  10.   
  11.         if (ch == '<')   
  12.   
  13.         {   
  14.   
  15.             ch = MoveNext();     //取下一个字符      
  16.   
  17.             if ((ch >= 'A') && (ch <= 'Z') || (ch == '!'))   
  18.   
  19.             {   
  20.   
  21.                 iBeginPos = Index;       //记录开始位置   
  22.   
  23.                 //表示可能是一个标签    
  24.   
  25.                 HtmlTag tag = GetTag();  //解析此Tag      
  26.   
  27.                 if (tag != null)   
  28.   
  29.                 {   
  30.   
  31.                     //首先判断是否有文本      
  32.   
  33.                     if (m_CurrentText.Lenght > 0)   
  34.   
  35.                     {   
  36.   
  37.                         //将文本作为一个普通Tag入栈      
  38.   
  39.                         Stack.Push(new HtmlTextTag(m_CurrentText));   
  40.   
  41.                     }   
  42.   
  43.                     tag.BeginPos = iBeginPos;   //记录此Tag的开始位置      
  44.   
  45.                     Stack.Push(tag);            //把Tag入栈      
  46.   
  47.                 }   
  48.   
  49.             }   
  50.   
  51.   
  52.   
  53.             ch = GetCurrentChar();   
  54.   
  55.             if (ch == '/')   
  56.   
  57.             {   
  58.   
  59.                 //可能是结束标签      
  60.   
  61.                 tagName = GetTagName();   
  62.   
  63.                 //从上到下查看Stack,如果Tag中存在      
  64.   
  65.                 if (FindInStack(tagName))   
  66.   
  67.                 {   
  68.   
  69.                     //在栈中找到名为tagName的元素,则把找到的元素出栈      
  70.   
  71.                     PopTag(tagName);   
  72.   
  73.                 }   
  74.   
  75.             }   
  76.   
  77.         }   
  78.   
  79.         else  
  80.   
  81.         {   
  82.   
  83.             //对于<AAA>xxx</AAA>之间的文本xxx,这里将作为TextTag来处理     
  84.   
  85.             m_CurrentText.Append(GetCurrentChar());   
  86.   
  87.         }   
  88.   
  89.         //继续处理下一个字符      
  90.   
  91.         ch = MoveNext();   
  92.   
  93.     }   
  94.   
  95.   
  96.   
  97.     //解析完成以后,如果栈不空,那么把元素出栈,并把最后一次出栈的元素作为根      
  98.   
  99.     if (Stack.Count > 0)   
  100.   
  101.     {   
  102.   
  103.         HtmlTag tag = null;   
  104.   
  105.         while (Stack.Count > 0)   
  106.   
  107.         {   
  108.   
  109.             tag = Stack.Pop();   
  110.   
  111.             PopTag(tag);   
  112.   
  113.         }   
  114.   
  115.   
  116.   
  117.         //最后一个元素作为根元素      
  118.   
  119.         if (tag != null)   
  120.   
  121.         {   
  122.   
  123.             m_listRoot.Add(tag);   
  124.   
  125.         }   
  126.   
  127.     }   
  128.   
  129. }   
  130.   
  131.   
  132.   
  133. private void PopTag(HtmlTag tag)   
  134.   
  135. {   
  136.   
  137.     int iLevel = Stack.Count;   
  138.   
  139.   
  140.   
  141.     //找到了元素,把iLevel到m_IMaxLevel中所有的元素按照全部作为tag的子元素      
  142.   
  143.     for (int i = iLevel + 1; i < m_iMaxLevel; i++)   
  144.   
  145.     {   
  146.   
  147.         for (j = 0; j < HashTable[i].Count; j++)   
  148.   
  149.         {   
  150.   
  151.             tag.Children.Add(HashTable[i][j]);   
  152.   
  153.         }   
  154.   
  155.     }   
  156.   
  157.   
  158.   
  159.     //表示栈已经为空,那么最后一次出栈的tag将作为根      
  160.   
  161.     if (Stack.Count == 0)   
  162.   
  163.     {   
  164.   
  165.         m_listRoot.Add(tag);   
  166.   
  167.     }   
  168.   
  169. }   
  170.   
  171.   
  172.   
  173. private void PopTag(string tagName)   
  174.   
  175. {   
  176.   
  177.     /*  
  178.  
  179.      * 元素出栈的时候,首先需要把当前已经存在了的HtmlTextTag入栈  
  180.  
  181.      * 比如:<A>文本段1<B>文本段2</B>文本段3</A>  
  182.  
  183.      * 在Parse中,当解析出<B>入栈前,需要先把"文本段1"入栈  
  184.  
  185.      * 在这里,解析出了</B>结束标志  
  186.  
  187.      * 那么首先需要把"文本段2"入栈。  
  188.  
  189.      * 解析出</A>则需要把"文本段3'入栈。  
  190.  
  191.      * 这样才能够保证"文本段1"和"文本段3"成为<A>的子节点,而"文本段2"作为<B>的子节点  
  192.  
  193.      */  
  194.   
  195.     if (m_CurrentText.Lenght > 0)   
  196.   
  197.     {   
  198.   
  199.         //将文本作为一个普通Tag入栈      
  200.   
  201.         Stack.Push(new HtmlTextTag(m_CurrentText));   
  202.   
  203.     }   
  204.   
  205.   
  206.   
  207.     HtmlTag tag = Stack.Pop();  //元素出栈      
  208.   
  209.     int iLevel = Stack.Count;   //记录栈元素数      
  210.   
  211.   
  212.   
  213.     while (tag.Name != tagName)   
  214.   
  215.     {   
  216.   
  217.         //将tag放入第iLevel层的List中      
  218.   
  219.         HashTable[iLevel].Add(tag);   
  220.   
  221.         tag = Stack.Pop();   
  222.   
  223.         iLevel = Stack.Count;   
  224.   
  225.     }   
  226.   
  227.   
  228.   
  229.     //元素出栈后续处理      
  230.   
  231.     PopTag(tag);   
  232.   
  233. }   
  234.   
  235.   
  236.   
  237. private HtmlTag GetTag()   
  238.   
  239. {   
  240.   
  241.     if ("如果发现是 < !--开头的元素"//则表示是注释      
  242.   
  243.     {   
  244.   
  245.         SkipComment();   
  246.   
  247.     }   
  248.   
  249.   
  250.   
  251.     HtmlTag tag = new HtmlTag();   
  252.   
  253.     tag.Name = GetTagName();   
  254.   
  255.     //这里的Attribute我将其作为HashTable类型,Hash[属性名]=属性值      
  256.   
  257.     tag.Attribute = GetTagAttribute();   
  258.   
  259.     return tag;   
  260.   
  261. }   

解析结束以后,通过访问m_listRoot就可以遍历出所有的节点了。上面仅仅是给出了大概的方法,不过我相信要将上面的方法转换成可运行代码,各位都是有这个能力的。。。

 

posted @ 2008-09-07 21:29 简单就好 阅读(452) 评论(2) 编辑

老田的专栏

提示:

根据这几天的访问量跟踪,我发现很多访者都没有很好地关注到真正进行算法描述的章节《解析Html生成标签树(一)》,特此进行提示。

搜索引擎一个最重要的步骤就是,获得网页的正文内容,我相信每个人看见一篇网页的时候,从视觉上都很容易知道哪个部分是正文内容,哪个部分是版权信息,哪个部分是广告信息。但是要让计算机明白这些,估计要若干年(到时候还不知道人类是否已经变异成4只眼睛,5个耳朵。。。)之后。

   在网络上大量存在一些关于网页正文抽取的理论性文章,最著名的应该数介绍北大天网的《搜索引擎原理技术与系统》一书中所介绍的网页净化技术了,中心思想大概就是,首先将Html源文件解析成一棵以Html标签为节点的树(为了后面的描述方便,我们称其为“Html树”),然后再根据一定的启发式规则进行判断,当然各位可以具体去找这书来看看。所以很多的都是参考这种方式来实现。遗憾的是我没有找到源代码,并且我也不擅长Linux编程,所以即使拿到代码,估计也会头痛很久(看不懂啊)。怎么办呢?Baidu以后Google,Google以后Baidu。我都不知道为了这个事情,向这两家贡献了多少流量啊,估计他们应该给我发奖金。但是我都没有找到自己想要的代码。。。据说有一个名叫HtmlParser的家伙可以做这东西。但是我下载了一个以后(后来证明应该不是正宗的,在一个老外写的Spider中有这么几个类http://www.codeproject.com/上下载的)发现不是我想要的,虽然可以很好的解析出里面的超级链接之类的东西。所以最终确定不能用,最多只能作为学习例子进行研究。

   估计HtmlParser应该是可以实现,但是我人懒,没有找到使用这东西的可执行文件,最主要的是我根本就还没有下载到HtmlParser工具包。我最喜欢的是能够先看效果,然后研究,因为我没有太多的时间来研究老外写的代码,说实在话,我的代码有点自己的风格,但是老外的代码有时候也是很难读懂的,这点“要向老外学习”。

   我也找到这么篇文章:http://blog.csdn.net/lanphaday/archive/2007/08/13/1741185.aspx,说这种方法可行,可是这个不是C#写的,也找不到可执行文件,最重要的是,最终我都没有读懂这文章。

   某天之后我终于醒悟,决定自己写一个能够解析Html文档的东西。自己写的,想怎么改就怎么改,想怎么用就怎么用。再废话几句,为什么要把Html先解析成Html树呢,因为在实际的搜索引擎应用中,人们可能会需要利用到每个Html的标签的一些属性(比如粗体、斜体、颜色等等)来判断一篇网页的重要程度,便于对网页进行进一步的挖掘。

我相信各位也是比较喜欢首先看效果的,我也首先给各位看看效果:

Html文件如下:

  1. <html>  
  2.   
  3.  <head>  
  4.   
  5.      <title>解析Html文件</title>  
  6.   
  7.      <meta content="!@#$%^&*(">  
  8.   
  9.  </head>  
  10.   
  11.  <body>  
  12.   
  13.      <table>  
  14.   
  15.          <tr>  
  16.   
  17.              <td>  
  18.   
  19.                  <table>  
  20.   
  21.                      <tr>  
  22.   
  23.                          <td></td>  
  24.   
  25.                      </tr>  
  26.   
  27.                  </table>  
  28.   
  29.              </td>  
  30.   
  31.              <td></td>  
  32.   
  33.          </tr>  
  34.   
  35.          <tr>  
  36.   
  37.              <td></td>  
  38.   
  39.              <td></td>  
  40.   
  41.          </tr>  
  42.   
  43.      </table>  
  44.   
  45.  </body>  
  46.   
  47. </html>  

 解析以后图片如下:

 

 结果到是理想的。下一篇将详细介绍生成算法

 在:http://blog.csdn.net/RonoTian/archive/2008/06/06/2517568.aspx中我已经详细介绍了方法,并且配上了核心思路和核心代码。

posted @ 2008-09-07 21:27 简单就好 阅读(535) 评论(1) 编辑
摘要: 61条面向对象设计的经验原则 摘抄自《OOD 启思录》--Arthur J.Riel 著 鲍志云 译 “你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看 成警铃,若违背了其中的一条,那么警铃就会响起。” 阅读全文
posted @ 2008-08-12 23:43 简单就好 阅读(149) 评论(1) 编辑
摘要: ORACLE系统概述ORACLE公司自86年推出版本5开始,系统具有分布数据库处理功能.88年推出版本6,ORACLE RDBMS(V6.0)可带事务处理选项(TPO),提高了事务处理的速度.1992年推出了版本7,在ORACLE RDBMS中可带过程数据库选项(procedural database option)和并行服务器选项(parallel server option),称为ORACLE...阅读全文
posted @ 2007-06-07 14:00 简单就好 阅读(295) 评论(0) 编辑
摘要: XP下安装SQLSERVER2000企业版本分类:默认栏目XP下安装SQL2000企业版本SQL2000企业版本适用于WIN 2000系统,2003系统和XP一般装不了需要选用个人版,当然如果你在不清楚的前提下辛辛苦苦下载了企业版本却不能安装,是不是很失望呢?这里介绍一个XP下安装装SQL2000企业版本方法以供参考~(对于XP上不能安装SQLSERVER2000可作为参考)办法如下:  一.在S...阅读全文
posted @ 2007-05-31 14:45 简单就好 阅读(2569) 评论(3) 编辑
摘要: 选中这个数据库,新建一个查询,输入下面的脚本:EXEC sp_dbcmptlevel database_name, 90USE database_nameEXEC sp_changedbowner 'sa'其中,database_name是此数据库的名称.运行可能需要一段时间,运行完成后,点击"关系图",刷新,应该就可以看到关系图了.阅读全文
posted @ 2007-04-29 13:43 简单就好 阅读(1001) 评论(0) 编辑
摘要: 1. 创建配置节类必须创建继承自ConfigurationSection的对象才能进行配置数据读写操作,ConfigurationSection提供了索引器用来获取和设置配置数据,需要注意的是拥有ConfigurationProperty特性的属性才会被存储,并且名称要保持大小写完全一致,如下面的代码中,所有的"id"必须保持一样。class ConfigSectionData : Configu...阅读全文
posted @ 2007-04-29 12:08 简单就好 阅读(1823) 评论(3) 编辑