这两天准备做一些网站编程的工作,于是对HtmlParse小研究了一下,目的是快速入手,而不是深入研究,做了一下整理,和大家共同讨论一下。

一,数据组织分析:

HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remark和Text相对简单,此处就将其忽略了。

  • Node是形成树结构表示HTML的基础,所有的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法,定义了Visitor访问机制。
  • AbstractNode是Node的一种具体的类实现,起到构成树形结构的作用,除了同具体Node相关的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode实现了大多基本的方法,使得它的子类,不用理会具体的树操作。
  • Tag是具体分析的主要内容。Tag分成composite的Tag和不能包含其他Tag的简单Tag两类,其中前者的基类是CompositeTag,其子类包含BodyTag,Div,FrameSetTag,OptionTag,等27个子类;而简单Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag这八类。

Node分成三类:

  • RemarkNode:代表Html中的注释
  • TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。
  • TextNode:文本节点
二,Visitor方式访问Html:
1,整体解析过程
  • 用一个URL或页面String做一个Parser
  • 用这个Parser做一个Visitor
  • 使用Parser.visitAllNodeWith(Visitor)来遍历节点
  • 获取Visitor遍历后得到的数据
2,Visit过程
  • 做解析之前做的事情:visitor.beginParsing();
  • 每次取到一个节点Node,让该Node接受accept该Visitor
  • 做解析后做的事情:visitor.finishedParsing();
3,获取节点的过程:逐步遍历Html,分析出Node。此部分较为复杂,且对于我们应用来说无需很多了解,暂跳过。
4,节点访问
节点访问采用Visitor模式,Node的accept方法和具体Visitor的visit方法是关键。
首先三类Node来accept的方式各不相同:
  • 对于所有TagNode都使用一个accept方法,即TagNode的accept方法。首先判断是否是标签结尾,如果是就visitor.visitEndTag (this);否则visitor.visitTag (this);
  • 如果是TextNode,那就visitor.visitStringNode (this);就可以了。
  • 如果是RemarkNode,那就visitor.visitRemarkNode (this);就可以了。

实际上NodeVisitor里边这四种visit方法都是空的,因为在不同的Visitor中对于这三类节点的处理是不同的;对于需要处理的节点,只要重载对应的visit方法就行了,如果不处理那就不理会就可以了;另外,如果用户用自己的Visitor,那么还可以灵活的处理不同类型的节点了。

系统为我们实现了下面我要介绍的8种Visitor,实际上可以看作是系统给我们演示了如何做各种各样的Visitor来访问Html,因为实际上我们要真正来用HtmlParser的话,还需要特定的Visitor,而通过简单的这些系统提供的Visitor组合是难以做成什么事情的。
三,系统Visitor功能简介:
  • ObjectFindingVisitor:用来找出所有指定类型的节点,采用getTags()来获取结果。
  • StringBean:用来从一个指定的URL获取移除了<SCRIPT></SCRIPT>和<PRE></PRE>之间代码的Html代码,也可以用做Visitor,用来移除这两种标签内部的代码,采用StringBean.getStrings()来获取结果。
  • HtmlPage:提取Title,body中的节点和页面中的TableTag节点。
  • LinkFindingVisitor:找出节点中包含某个链接的总个数。
  • StringFindingVisitor:找出遍历的TextNode中含有指定字符串的个数。
  • TagFindingVisitor:找出指定Tag的所有节点,可以指定多种类型。
  • TextExtractingVisitor:从网页中把所有标签去掉来提取文本,这个提取文本的Visitor有时是很实用的,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签之间的文本,例如<a>中的链接也去掉了。
  • UrlModifyingVisitor:用来修改网页中的链接。
四,Filter
如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。所以说要想用HtmlParser,首先要熟悉上面讲到的数据组织。
系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。
Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:
NodeList nodeList = myParser.parse(someFilter);
解析之后,我们可以采用:
Node[] nodes = nodeList.toNodeArray();
来获取节点数组,也可以直接访问:
Node node = nodeList.elementAt(i)来获取Node。
另外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的extractAllNodesThatMatch(someFilter)来进一步过滤,同时又可以用NodeList的isitAllNodesWith(someVisitor)来做进一步的访问。
这样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不同的应用可以采用visitor来遍历Html节点提取数据,也可以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。
站长请看这里>>

转载于:https://www.cnblogs.com/XINLG/archive/2011/06/23/2088052.html

.net HtmlParser初步使用研究相关推荐

  1. 关于Unity3D的初步学习研究周记

    关于Unity3D的初步学习研究周记(1) 学习总结: 本次学习Unity3D其实算是对基本的复习,因为在以前自己玩过一段时间,我也有一点C#的基础,所以我是直接开始做的一些小测试,因为事件原因,两个 ...

  2. 北大林宙辰:追求机器学习研究的美感

    在知乎上有人提问:如何评价北京大学林宙辰老师? 高赞答曰:功底深厚,难以望其项背. 这表现在几个方面-- 1.从外界普遍的标准来看,自2000年至今,他的论文引用量已经高达2w+:同时也是IEEE.I ...

  3. 一位大学教师对学生的建议:如何做好研究

    1. 做计划!  我告诉我的学生, 写研究论文的第一步就是要明确你真的有一份研究论文要写. 写一份计划书, 其中应当包括在某一天需要完成的一系列的重要进展. (例如: 9月20日前找到10份资料, 1 ...

  4. 机器人导航技术的研究现状和发展趋势

    机器人导航技术的研究现状和发展趋势 1 导航技术的研究现状 1.1 路基无线电导航系统 1.2 蜂窝导航 1.3 惯性导航 1.4 卫星导航系统 1.5 其他导航 2 机器人导航中的相关技术 2.1 ...

  5. 两电平直接转矩控制MATLAB,基于MATLAB/SIMULINK动态仿真模型的异步电动机直接转矩控制的研究...

    l引言MATLAB是一种面向科学与工程计算的高级语言,它集科学计算.自动控制.信号处理.神经网络.图像处理等于一体,具有极高的编程效率.MATLAB提供的SIMUIJNK是用来对动态系统进行建模.仿真 ...

  6. fNIRS最新研究 | 脑间和脑内耦合对运动同步的差异贡献

    导读 人类大脑支持行为的一个基本特征是它在脑区之间建立连接的能力.一种有前景的方法认为,在社交行为中,大脑区域不仅与大脑内的其他脑区建立连接,而且还与互动伙伴的其他脑区协调活动.本文探索脑间和脑内耦合 ...

  7. 数据伦理、国家安全与海外上市: 基于滴滴的案例研究

    文/韩洪灵,陈帅弟,刘杰,陈汉文 摘要 数据这一新兴生产要素在改变全球经济发展模式与重塑企业商业模式的同时,也逐步产生了新的系列伦理问题,即数据伦理问题.国家网信办对滴滴等系列海外上市企业启动网络安全 ...

  8. 计算机辅助管理与应用,计算机辅助学校体育管理的研究与应用

    2003-1-29  中学体育网 计算机辅助学校体育管理的研究与应用 孙延超 (胜利油田六十一中学,山东 东营  257105) 摘要:运用计算机辅助学校体育管理工作,标志着学校体育管理工作向科学化. ...

  9. 当代化工研究杂志当代化工研究杂志社当代化工研究编辑部2022年第22期目录

    本刊特稿<当代化工研究>投稿:cnqikantg@126.com     正己醇耦合氢氧化钾水解溶出光伏组件中乙烯醋酸乙烯酯 郭蔓;李登新;蒋红博;朱宏艺;高康宁;夏张; 1-4     ...

最新文章

  1. Tom Clancy's Splinter Cell: Double Agent
  2. C++中的对象_纪要(二)
  3. dubbo+rabbitmq+hystrix实现服务的高可用
  4. struts验证框架失效
  5. 夜深,你的手机为谁而开
  6. python新手入门代码-[代码全屏查看]-新手初学Python实现某论坛自动签到功能
  7. windows源码安装apache2 win安装apache 阿帕奇服务器
  8. linux日志过大怎么查看,Linux查看日志常用命令
  9. java excel 打勾_在excel中如何打钩
  10. 运用系统分析方法,分析校园二手交易平台的可行性
  11. Label-Consistent Backdoor Attacks
  12. 大表哥在csdn的第一篇博客
  13. 电容触摸按键原理和实现
  14. You can‘t specify target table ‘Person‘ for update in FROM clause
  15. 阿里云购买域名到icp备案
  16. Qiime2最全安装教程--包教包会,可私信远程免费帮装
  17. 数字商会 Paul Brigner 访谈:架起区块链行业与政府的沟通桥梁 | ArcBlock 播客
  18. 风向标瑞福进取昨发疯,真的转势了
  19. JS数组常用方法整理-1
  20. javascript工具类函数

热门文章

  1. python画图-如何用python画图
  2. python能绘制统计图吗-使用Python绘制图表大全总结
  3. python中处理日期和时间的标准模块是-Python时间相关处理
  4. python退出程序-Python程序退出方式小结
  5. python训练营免费领取-马哥教育官网-专业Linux培训班,Python培训机构
  6. 不是python中用于开发用户界面的第三方库-Python计算生态习题(50题)
  7. python制作动态条形图-python – 动态更新matplotlib中的条形图
  8. python小程序源代码-Python数据库小程序源代码
  9. python微控制器编程从零开始-Python微控制器编程从零开始 使用MicroPython
  10. 学会python之后-【一点资讯】学会Python后,人生简直开挂了!