`
zhyun29
  • 浏览: 30613 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

[转帖]HtmlParser初步研究

    博客分类:
  • java
阅读更多
 
by lostfire

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

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

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

Node分成三类:

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


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

系统为我们实现了下面我要介绍的8种Visitor<wbr></wbr>,实际上可以看作是系统给我们演示了如何做各种各样的Visito<wbr></wbr>r来访问Html,因为实际上我们要真正来用HtmlParser<wbr></wbr>的话,还需要特定的Visitor,而通过简单的这些系统提供的V<wbr></wbr>isitor组合是难以做成什么事情的。
 
三,系统Visitor功能简介:
  • ObjectFindingVisitor:用来找出所有指定类型<wbr></wbr>的节点,采用getTags()来获取结果。
  • StringBean:用来从一个指定的URL获取移除了<wbr></wbr><script></script>和
    >之间代码的Html代码,也可以用做Visitor<wbr></wbr>,用来移除这两种标签内部的代码,采用StringBean<wbr></wbr>.getStrings()来获取结果。     
  • HtmlPage:提取Title,body中的节点和页面中的T<wbr></wbr>ableTag节点。
  • LinkFindingVisitor:找出节点中包含某个链接的<wbr></wbr>总个数。
  • StringFindingVisitor:找出遍历的TextN<wbr></wbr>ode中含有指定字符串的个数。
  • TagFindingVisitor:找出指定Tag的所有节点<wbr></wbr>,可以指定多种类型。
  • TextExtractingVisitor:从网页中把所有标签<wbr></wbr>去掉来提取文本,这个提取文本的Visitor有时是很实用的<wbr></wbr>,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签<wbr></wbr>之间的文本,例如中的链接也去掉了。
  • 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来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。
 
参考:


 

分享到:
评论

相关推荐

    htmlparser

    META-INF/maven/org.htmlparser/htmlparser/pom.properties META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans....

    HtmlParser

    它广泛应用于搜索引擎优化、数据分析、市场研究等多个领域。 在Python中,HTMLParser是内置的HTML解析器,它允许开发者编写自定义的事件驱动的解析器来处理HTML或XML文档。使用HTMLParser,我们可以解析网页内容,...

    HTMLParser.net源代码HTMLParser.net使用demo

    通过研究这些示例代码,开发者可以了解如何在自己的.NET项目中集成HTMLParser.net,以解析和操作HTML文档。例如,如何创建一个解析器实例,如何使用CSS选择器选取元素,如何监听解析事件等。这些示例将帮助新手快速...

    htmlparser.jar文件

    在描述中提到的“org.htmlparser.Node”和其他的.class文件,这些都是HTMLParser库的核心组成部分。`org.htmlparser.Node` 是HTMLParser中的一个关键接口,它代表HTML文档中的一个节点,可以是元素(Element)、注释...

    c#版htmlparser htmlparser.dll htmlparser源代码

    `htmlparser.dll`是这个库的动态链接库文件,它包含了编译好的类和方法,可以直接在C#项目中引用以使用HTMLParser的功能。在C#项目中,我们可以通过添加对dll的引用来调用库中的方法,比如解析HTML字符串、查找特定...

    HTMLParser提取网页超链接研究

    ### HTMLParser提取网页超链接研究 #### 一、引言 随着互联网技术的快速发展和普及,全球信息资源呈爆炸式增长。在这个过程中,各种互联网搜索引擎(例如百度、谷歌等)应运而生,它们极大地便利了人们获取所需...

    htmlparser-1.2.1 jar

    htmlparser-1.2.1jar包下载htmlparser-1.2.1jar包下载

    htmlparser库与教程

    在“htmlparser.jar”中,包含了HTMLParser库的所有类和方法,使得开发人员可以将这个库集成到他们的Java项目中。使用jar文件,开发者可以直接导入并使用HTMLParser的API来解析和操作HTML文档。 "htmlparser实现从...

    htmlparser网页分析

    以下是对HTMLParser及其相关知识点的详细说明: 1. HTML解析:HTMLParser的设计目的是为了处理HTML文档的非结构化特性。由于HTML经常存在不规范的情况,如缺少闭合标签、嵌套错误等,HTMLParser通过容错机制,能够...

    网络编程辅助工具20160720(HTTP工具增加提示信息+HtmlParser初步完成+第三方小白的SocketCapture加入).rar

    2. **HtmlParser**:HtmlParser通常是一个解析HTML文档的库或工具,用于处理和解析HTML代码。"初步完成"表明这是一个正在开发中的功能,可能尚处于早期阶段,但已经可以进行基本的HTML解析工作,对网页内容的抓取和...

    Winista.Htmlparser.Net 源码 +Demo

    《深入解析Winista.Htmlparser.Net:C#实现的HTML解析库》 ...通过深入研究其源码和示例项目,我们可以更好地理解和利用这个工具,提升我们的HTML处理能力。无论是网页抓取还是数据解析,它都能成为我们手中的利器。

    HtmlParser源码及demo

    以下是对`HtmlParser`及其相关知识点的详细说明: 1. **HTML解析**:HTMLParser提供了对HTML文档的解析能力,将HTML文本转换为可操作的对象模型。它能够处理嵌套标签、属性、注释以及实体引用等HTML元素。 2. **...

    htmlparser1.6最新版

    本文将深入探讨HTMLParser 1.6版本的功能、用途、使用方法以及其在IT领域的应用。 HTMLParser的核心功能是解析HTML文档,即使在面对结构不规则或者非标准的HTML代码时,也能有效地进行解析。它提供了灵活的事件驱动...

    htmlParser.jar包

    在很多Web抓取、信息提取以及网页分析的项目中,HTMLParser都是一个理想的工具。 HTMLParser库的设计考虑了易用性和灵活性,它提供了丰富的API,允许开发者通过编程方式来访问和操作HTML文档的各个元素,如标签、...

    HTMLParser 使用举例

    * 浏览器前端:作为浏览器的前端,用于显示网页的初步阶段。 * 连接检查:检查连接是否有效。 * 站点监控:检查网页的变化。 HTMLParser 提供了多种机制来帮助实现这些功能,例如 filters、visitors 和 JavaBeans。...

    HtmlParser 2.1 码源

    **HtmlParser 2.1 知识点详解** HtmlParser是一个强大的开源库,主要用于解析HTML文档,它在处理不规则的HTML结构时表现出了极高的灵活性和稳定性。这个"HtmlParser 2.1 码源"是该库的2015年6月的最新版本,包含了...

    HtmlParser源码及其jar包

    它可能包含旧版API和特性,对于需要兼容旧项目或研究历史版本的人来说是有价值的。 - `HTMLParser-2.0-SNAPSHOT-src.zip`:这是一个开发中的版本,标记为“SNAPSHOT”,意味着它包含了最新的开发成果,可能包含新...

    HTMLParser使用文档和jar包

    HTMLParser是一个Java库,专门设计用于解析HTML文档。...本篇将详细阐述HTMLParser的使用方法、功能以及提供...通过文档学习、源代码研究和二进制包的使用,开发者可以充分利用HTMLParser的功能,提高处理HTML文档的效率。

Global site tag (gtag.js) - Google Analytics