Html解析工具-HtmlAgilityPack

这个工具是在暑假的时候发现的。但是最后没用这个工具。不过,这个工具可是非常强悍的。。 HtmlAgilityPack主要就是解析DOM的。常用的基础类其实不多,对解析DOM来说,就只有HtmlDocument和HtmlNode这两个常用的类,还有一个 HtmlNodeCollection集合类。我给出一个抓取我博客首页文章的例子。看代码可能更清楚一点。你可以去看看压缩包里提供的文档。 xpath如果自己写表达式比较麻烦。所以我还找到了这个HtmlAgilityPack提供了的一个xpath辅助工具-HAPExplorer。都给出了地址。 首先看我的例子,抓取我博客的首页文章: using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Diagnostics; using System.Threading.Tasks; using System.IO; using System.Data; using System.Data.SqlClient; using HtmlAgilityPack; namespace leaver { class Program { static void Main(string[] args) { HtmlWeb web = new HtmlWeb(); HtmlDocument doc = web.Load("http://leaver.me/"); HtmlNode node = doc.GetElementbyId("content"); StreamWriter sw = File.CreateText("leaver.txt"); //从根节点选中class=hfeed的节点 string cfeed = node.SelectSingleNode("/html[1]/body[1]/div[1]/div[1]/div[2]/div[1]/div[1]").OuterHtml; HtmlNode hfeed = HtmlNode.CreateNode(cfeed); foreach (HtmlNode child in hfeed.ChildNodes) { if (child.Attributes["id"] == null || child.Attributes["id"].Value.Substring(0, 2) != "po") continue; HtmlNode hn = HtmlNode.CreateNode(child.OuterHtml); Write(sw, String.Format("标题:{0}", hn.SelectSingleNode("//*[@class=\"entry-title\"]").InnerText)); Write(sw, String.Format("日期:{0}", hn.SelectSingleNode("//*[@class=\"byline\"]").InnerText)); Write(sw, String.Format("摘要:{0}", hn.SelectSingleNode("//*[@class=\"entry-summary\"]").InnerText)); Write(sw, "----------------------------------------"); } sw.Close(); Console.ReadLine(); } static void Write(StreamWriter writer, string str) { Console.WriteLine(str); writer.WriteLine(str); } } } 程序运行结果: xpath表达式的具体书写都是需要分析你需要解析的网站源码的。。。。 xpath辅助工具的界面: 下载:HtmlAgilityPack 下载:HAPExplorer

2012-09-22 · 1 min · bystander

《商务智能与数据挖掘-谢邦昌》第三章读书笔记

3.数据挖掘 3.1定义 数据挖掘是指找寻隐藏在数据中的信息,如趋势。特征及相关性的过程。也就是从数据中发掘信息或知识(Knowledge Discovery in Database)。也有人称之为数据考古学。。记住,它不是一个无所不能的软件或是一种技术,他是一种结合数种专业技术的应用。数据挖掘工具从数据中发掘出个各种假设。但是并不帮你查证。确认这些假设。也不帮你判断这些假设是否有价值。 3.2数据挖掘的功能 1.分类(Classification),按照分析对象的属性进行分门别类加以定义。建立类组(Class)。例如划分银行信用申请者的风险属性,使用的技术有决策树(Decision Tree),记忆基础推理(memory-based reasoning) 2.估计(Estimation),根据既有连续性数值的相关属性数据。以获知某一属性未知值。。例如按照信用申请者的教育程度,行为估计其的信用卡缴费量。使用的技术包括相关分析,回归分析及神经网络算法。 3.预测(Prediction)根据对象属性的过去观察值来估计该属性未来值。比如根据顾客过去刷卡消费量来预测其未来刷卡消费量。使用的技术包括回归分析,时间序列分析,神经网络。 4.关联分组(Affinity Grouping)从所有对象决定哪些相关对象放在一起销售。比如那个啤酒和尿不湿。。在客户营销系统上,此功能用来确定交叉销售。。 5.聚类(Clustering),将异质总体中区分为特征相近的同质类组。目的是将组和组之间的差异辨识出来。并对个别组内相似样本进行挑选。 3.3数据挖掘的步骤 1.理解数据和数据所代表的含义(Data Understanding) 2.获取相关知识和技术(Domain Knowledge Acquisition) 3.整合和检查数据(Integration and Checking) 4.去除错误或不一致的数据(Data Cleaning) 5.建模与假设(Model and Hypothesis Development) 6.数据挖掘运行(Running) 7.测试与验证所挖掘的数据(Testing and Verification) 8.解释与使用数据(Interpretation and Use) 3.4数据挖掘建模的标准CRISP-DM CRISP-DM模型强调完整的数据挖掘过程,不能只针对数据整理、数据呈现、数据分析以及构建模型,还需要对企业的需求问题进行了解,同时,后期对模型进行评价和模型的延伸应用,也是一个完整的数据挖掘过程不可或缺的要素。 CRISP-DM分为六个阶段(phase)和四个层次(level),分别简介如下: 1. 商业理解(Business Understanding) 本阶段主要的工作是要针对企业问题以及企业需求进行了解确认,针对不同的需求做深入的了解,将其转换成数据挖掘的问题,并拟定初步构想。在此阶段中,需要与企业进行讨论,以确定分析者可以对于问题有非常清楚的了解,只有这样才可以正确地针对问题拟定分析过程。 2. 数据理解(Data Understanding) 这部分包含建立数据库与分析数据。在此阶段必须收集初步数据,然后了解数据的内涵与特性,选择要进行数据挖掘所必须的数据,然后进行数据整理及评估数据的质量,必要时再将分属不同数据库的数据加以合并及整合。数据库建立完成后再进行数据分析,找出影响预测最大的数据。 3. 数据预处理(Data Preparation) 此步骤和第二步数据理解是数据处理的核心,这是建立模型之前的最后一步数据准备工作。数据预处理任务很可能要执行多次,并且没有任何规定的顺序。 4. 建立模型(Modeling) 针对已预处理过的数据加以分析,配合各种技术方法加以应用,针对既有数据建构出模型,替企业解决问题;面对同一种问题,会有多种可以使用的分析技术,但是每一种分析技术却对数据有些限制及要求,因此需要回到数据前置处理的阶段,来重新转换需要的变量数据加以分析。 5. 评价和解释(Evaluation) 从数据分析的观点看,在开始进入这个阶段时已经建立了看似是高质量的模型,但在实际应用中,随着应用数据的不同,模型的准确率肯定会变化。这里,一个关键的目的是确定是否有某些重要的商业问题还没有充分地考虑。在这个阶段的结尾,应该获得对数据挖掘结果的判定。 6. 实施(Deployment) 一般而言,创建模型完成并不意味着项目结束。模型建立并经验证之后,可以有两种主要的使用方法。一种是提供给决策人员做参考,由他察看和分析这个模型之后提出行动方案建议;另一种是把此模型应用到不同的数据集上。此外,在应用了模型之后,当然还要不断监控它的效果。 四个层次分别为阶段(phase)、一般任务(generic task)、专项任务(specialized task)、流程实例(process instance)。每个阶段由若干一般任务组成,每个一般任务又实施若干专项任务,每个专项任务由若干流程实例来完成。其中,上两层独立于具体数据挖掘方法,即是一般数据挖掘项目均需实施的步骤(What to do?),这两层的任务将结合具体数据挖掘项目的“上下文”(context)映像到下两层的具体任务和过程。所谓项目的“上下文”是指项目开发中密切相关、需要综合考虑的一些关键问题,如应用领域、数据挖掘问题类型、技术难点、工具及其提供的技术等。

2012-09-21 · 1 min · bystander

Eclipse安装JavaCC

 今年的编译原理课程上机实践是讲这个的。。要求用JavaCC来做一个简单的解释器。今天总算是有点时间找找文档先把这个安装了。安装过程很简单。。 1.希望你已经安装了Eclipse。。。 2.去sourceforge该项目主页下载javaCC压缩包 3.下载完成后解压到你的Eclipse根目录。会提示覆盖plugins和features。直接覆盖即可。 4.测试一下是否成功。具体步骤就是,打开eclipse,新建一个空java项目。然后对着项目点击右键new->other->javaCC->javaCC template file。然后选择命名空间。包名。和文件名就可以了。这个地方的什么的是由你建立的java项目决定的。所以你可以先把java项目设置好,然后直接选就可以了。。 5.点击运行。选择java application。控制台输出 Reading from standard input… Enter an expression like “1+(2+3)*4;”: 完成。。。 Update:其实吧。这里安装的是JavaCC的插件。但是已经可以进行开发了。可能你需要一个例子来开始。或者你不喜欢eclipse。那么去JavaCC的项目下载你喜欢的即可。我下的是javacc-5.0.zip 里面有例子。可以参考。

2012-09-17 · 1 min · bystander

通过Windows应用进行服务寄宿示例代码

此程序部分源码来自《WCF技术剖析》。。但是。这本书上讲的非常不清楚。有些很小的地方没讲。。导致出现很多问题。。。比如ListView需要先添加列。默认的config需要删除。等等。。 最终是成功了。 源码下载:Lazy.FormDemo

2012-09-09 · 1 min · bystander

WCF读书笔记(4)

三种供客户端和服务端控制通信的契约介绍: 1.服务契约描述了由特定服务端点所公开的操作,每一种操作,通过参数和返回值定义请求和响应消息的格式。 2.数据契约描述了复杂类型如何被串行化为消息的一部分,数据契约是服务契约中优先用来包含复杂类型的方式。 3.消息契约提供对某个soap消息格式的控制,包括支持定制消息标题和数据契约所描述的单个消息体元素。 消息参数(Message Parameter) 对于 [OperationContract] string MyOp(string s); 若客户端传入的参数为“Hello”,则生成的请求消息体中标记为 Hello,而响应返回的消息体则被标记为返回内容,可以通过 [OperationContract] [return:MessageParameter(Name="ResponseString"] string MyOp([MessageParameter(Name="RequestString")] string s); 来定制消息中的标签。 绑定元素 实际上,每个绑定元素都会被映射到一个信道上,这样,绑定元素和信道在这个意义上可以互换。 执行上下文(OperationContext) 是System.ServiceModel命名空间的一种类型,他为服务请求提供了对执行上下文的访问,OperationContext.Current为请求在生命周期期间提供了对上下文的访问。 WCF的实例化模式 实例化控制模式服务对象被分配给请求的方式,一旦服务主机已经建立而且为每个端点创建了信道监听器,对各终端的请求已经由适当的服务对象所执行,则这些对象是基于服务类型的实例化模式的。他们是InstanceContextMode的一个枚举。 1.PerCall 服务对象为每一个对服务的调用所创建。 2.PerSession 对每一个客户端创建一个。默认是这样 3.Single 创建单一的服务对象。并由所有客户端的调用使用。 尽可能使用PerCall,大规模的部署避免PerSession并发。 WCF的四种会话 应用会话,传输会话,可靠会话,安全会话。 信道发生器取得SessionId ChannelFactory<IService> factory=new ChannelFactory<IService>("Service"); IService proxy=factory.CreateChannel(); IContextChannel obj=proxy as IContextChannel; string s=obj.SessionId;

2012-09-09 · 1 min · bystander

WCF读书笔记(3)

WCF的四大行为 契约行为(Contract Behavior),操作行为(Operation Behavior),服务行为(Service Behavior),终结点行为(Endpoint Behavior)。 如果把WCF看做是消息处理,对象激活与操作执行的管道,那么我们可以通过相应的行为来改变这个管道中某个环节的工作方式。比如加个密啊。什么的。 单向模式(One-Way) 单向模式不需要服务器执行后返回一个回复,多用于不要求服务执行后返回一个回复,并且能够容忍日志记录的失败,只有返回类型为void的才允许设置为true,同理,ref和out参数作为另一种类型的输出。也是不允许的。 WCF的三种异步操作 1.异步信道调用:客户端可以通过代理对象进行异步调用信道。 2.One-Way消息交换:单向的消息交换一旦抵达传输层,马上返回,从而实现异步 3.异步服务实现:服务端在具体实现服务操作的时候。采用异步调用的方式。 序列化: XMLSerializer序列化对象时,必须是公有,可读可写的属性,才能序列化。 WCF的四大契约 服务契约(Service Contract),数据契约(Data Contract),消息契约(Message Contract),错误契约(Fault Contract) 信道: 信道是为了便利WCF中客户端和服务的通信来设置的。ServiceHost为每个断点创建一个信道侦听器,侦听器产生通信通道,代理则产生一个信道发生器,发生器产生客户端的信道,两种信道相互兼容并且能有效处理之间的信息。 实际上,通信信道是有一个分层的信道栈组成-栈中的每一个信道都在消息处理过程中负责实施一个特定动作,信道栈包含一个传输信道,一个消息编码信道,和任意数量的消息处理信道,绑定则将决定了哪些信道留在信道栈中。当行为穿过信道栈时,消息处理方式将会有所改变。。

2012-09-08 · 1 min · bystander

WCF双工通信示例

 这两天在看WCF的书籍。就参考书上的代码写了这个例子。不得不说。书上有些错误的地方。。运行明显报错。改了一下。顺利通过。 先运行Hosting。然后运行Client。可以看到效果。不过不知道为什么会有如下的一个提示: 目标程序集不包含服务类型。可能需要调整此程序集的代码访问安全策略。 点击确定后并不影响程序运行。。但是也是个问题。。找了一下解决方法。都没有解决。。可能是我新建契约服务的时候,删掉了默认的IService配置。 //update:此问题解决了。是因为默认的app.config太多。对于典型的四层结构。需要删除契约和服务中的app.config。。 暂时先放着吧。 运行截图: 示例代码下载:Lazy.Duplex

2012-09-07 · 1 min · bystander

WCF读书笔记(2)

信道形状(Channel Shape) 用来表述不同的消息交换模式对消息交换双方信道(信息交换的管道)的不同要求,有什么IOutputChannel IReplyChannel IDuplexChannel之类的。。 对于IReplyChannel,服务器返回一个RequestContext类型,作为请求和回复之间的一道桥梁,可以获取也可以返回消息。 会话信道(Session Channel) 从状态保持的角度,信道可以分为两种类型,Datagram Channel和Session Channel,前者不和客户端绑定,后者可以识别客户端。 对于WCF的信道层来说,信道管理器在客户端和服务端扮演不同的角色。服务端的信道管理器用于监听来自客户端的请求,而客户端的信道仅仅是单纯创建用于请求发送和回复接收的信道,因此服务端的消息管理器又称为信道监听器(Channel Listener),客户端的信道管理器则称之为信道工厂(Channel Factory) 绑定元素(Binding Element) 构成一个绑定对象的元素,绑定实现了通信的所有细节,通过创建信道栈实现对消息的交换,系统绑定是指服务于某种类型场景的绑定元素的有序集合。 包括什么BaseHttpBinding之类的。 一个程序集包括元数据,中间语言代码,和资源。程序集已经加载,将一直保存在内存中,直到应用程序域卸载。最好摒弃添加服务引用的服务调用方式,而是直接将包含服务契约的程序集部署到客户端。客户端以直接创建代理的方式进行调用。 WCF可以看成是适配器,是CLR类型和XML两个不同世界的纽带。 依赖倒置原则:即抽象不应该依赖细节,细节应该依赖于抽象;即要针对接口编程,不要对实现编程。高层模块不应该依赖低层模块。两个都应该依赖抽象。 契约关心的是我能做到。而不在于我如何做到。 封送(Marshaling) 解决跨应用程序域对象访问的问题,需要采用一种特别的机制,那就是封送。分为按值封送和按引用封送 按值封送实现了跨应用程序域的数据共享 按引用封送则实现了跨应用程序域的远程调用。 如果一个程序员频繁的使用复制粘贴编程。那就意味着设计需要重构

2012-09-06 · 1 min · bystander

WCF读书笔记(1)

信道的分类:Transport Channel 信道 1.Message Encording Channel 2.Protocol Channel 信道管理器(Channel Manager),信道管理器用于信道栈的创建和生命周期的管理 1.ChannelListener 2.ChannelFactory WCF服务调用的两种典型方式 1.是借助代码生成工具svcUtil.exe导入元数据生成客户端代码和配置,添加服务引用采用的就是这种方式,工具会创建一个继承自Client的服务代理类型。 2.是通过ChannelFactory直接创建服务代理对象进行服务调用。 如果客户端已经进行了终结点的配置 那么通过信道工厂进行调用的代码大致如下: using(Channel<IService> channelFactory=new ChannelFactory<IService>("Service")) { IService ise=channelFactory.CreateChannel(); using(ise as IDisposable) { ise.MethodName(); } } WCF处理的是跨应用程序域,跨机器,跨网络的通信,所以WCF大多数时间进行网络传俗这样的IO操作,IO绑定的操作是采用异步编程(APM【Asynchronous Programming Model】) 消息交换模式MEP(Message Exchange Pattern) MEP定义了参与者进行消息交换的模板,代表一系列的模板,他们定了消息的发送者和接收者,相互进行消息传递的次序,比较典型的三种 1.Datagram 数据包模式,嘴尖的SEND/FORGET模式也叫One-Way模式,基于从一个源到另一个或多个目的地的单向消息传输,并不期待回复 消息报的发送可以分成三个模式,分别是单目的地模式,多投模式,广播模式。 依次接受方更强大。。 2.Request/Reply模式 使用最多的一种模式,请求期待回复。采用同步通信方式,但也可用于异步通信 3.Duplex 双工模式 双方可以互发消息,实现服务器回调客户端。订阅/发布是其中一种典型的实例,TCP可以提供原生的双工通信,WCF通过WSDualHttpBinding实现了基于Http的双工通信,实际上是采用两个HTTP通道实现

2012-09-05 · 1 min · bystander

面试时,如何向公司提问?

 原文来自阮一峰的网络日志 以前,我写过一篇《如何面试程序员》,探讨公司如何向应聘者提问。 今天,我看到硅谷招聘经理Steve Buckley的一篇文章,正好探讨了同一件事的另一面:应聘者如何向公司提问。 很多人将面试看作一种单向选择,事实上,面试是一种双向选择:不仅是公司挑选你,也是你挑选公司。面试就是为双方提供互相了解的机会,公司在评估你,你也在评估公司。 面试官也知道这一点,所以他们有心理准备,期待你提出问题,并且会做出回答。所以,面试时不要浪费向公司提问的机会。而且,你主动提问,表明你比较重视这个职位,会加深面试官对你的印象,可能会提高面试的成功率。 有一些注意点,你需要知道: 1. 面试之前,一定要做准备,多了解公司的情况。 2. 你提出的问题,应该围绕"这份工作是否合适我"这个中心点,其他与应聘关系不大的问题,不宜多问。 3. 提问的时候,要自然放松,不要害羞,就把它当作普通的聊天。你要表现出对公司的真诚兴趣。 4. 提问要直接了当,不要绕圈子。提出问题之后,你要保持安静,让面试官多说话。 5. 面试官回答的时候,你可以做笔记,或者事先询问能不能做。笔记必须简短,你的大部分时间,要用来全神贯注倾听面试官的回答,并与其有眼神的交流。 6. 面试结束后一周内,最好打一个电话或发一封邮件,了解公司对你的反馈意见。即使面试失败,你不妨也问一下原因,这会有助于你以后的面试。 下面是一些你可以问的典型问题。 问题一:你们为什么要招聘这个职位? Q1: Why are you currently recruiting for this position? 这个问题会使得面试官开始谈论当前的项目,或者谈论前一位离职人员。无论哪种情况,都会让你了解,一些与你最密切相关的公司情况。 问题二:你们的新员工多吗? Q2: Do you have many new staffs? 这个问题起一个过渡作用,使得谈话导向公司内部的情况。但是,它本身也能说明一些问题。如果公司成立已经超过四年,又没有新项目,但是新员工却很多,这往往说明公司文化不是很健康。 问题三:你们公司(团队)目前面临的最大挑战是什么? Q3: What are the biggest challenges your team are facing right now? 如果面试官开始谈论一些具体的技术问题,这很好;如果他的回答是项目时间紧迫,或者需要更多的资金,那你就要小心一点了,公司管理上面可能有问题。 问题四:什么新技术(编程语言)是你们未来希望采用的? Q4: What technologies/languages would you like to see your team adapt to that aren’t currently being utilised? 如果你申请的是技术职位,面试官恰巧又是技术负责人,那么这个问题将会非常合适。你会对公司的技术路线有所了解和准备,一旦入职,就能更好地适应公司的需要。 问题五:在业务方面,有没有什么地方是你们不满意的,未来想要改进的? Q5: Few companies, if any, are 100% satisfied with the way their business is operating. If you could simply flick a switch to fix it, what one thing would you change? 很少有公司,会百分之百满意自身的现状,即使那些状况很良好的公司也是如此。这个问题可以让你对公司管理层的关注重点和担忧之处,有所了解。 问题六:我申请的这个职位,对公司的业务有何影响? Q6: If you struggle to fill the position I have applied for, what impact would that have on the business? 这个问题会让你了解自己在公司的角色,以及你的岗位对公司是否重要。 (完)

2012-09-02 · 1 min · bystander