ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:24.48KB ,
资源ID:12312514      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12312514.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(htmlparser文档.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

htmlparser文档.docx

1、htmlparser文档htmlParser简单介绍一, 数据组织分析:HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remark和Text相对简单,此处就将其忽略了。Node是形成树结构表示HTML的基础,所有的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法,定义了Visitor访问机制。 AbstractNode是Node的一种具体的类实现,起到构成树形结构的作用,除了同具体Node相关的accetp

2、方法,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这八类

3、。 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该Visi

4、tor 做解析后做的事情:visitor.finishedParsing(); 3,获取节点的过程:逐步遍历Html,分析出Node。此部分较为复杂,且对于我们应用来说无需很多了解,暂跳过。4,节点访问节点访问采用Visitor模式,Node的accept方法和具体Visitor的visit方法是关键。首先三类Node来accept的方式各不相同:对于所有TagNode都使用一个accept方法,即TagNode的accept方法。首先判断是否是标签结尾,如果是就visitor.visitEndTag (this);否则visitor.visitTag (this); 如果是TextNode,

5、那就visitor.visitStringNode (this);就可以了。 如果是RemarkNode,那就visitor.visitRemarkNode (this);就可以了。 实际上NodeVisitor里边这四种visit方法都是空的,因为在不同的Visitor中对于这三类节点的处理是不同的;对于需要处理的节点,只要重载对应的visit方法就行了,如果不处理那就不理会就可以了;另外,如果用户用自己的Visitor,那么还可以灵活的处理不同类型的节点了。系统为我们实现了下面我要介绍的8种Visitor,实际上可以看作是系统给我们演示了如何做各种各样的Visitor来访问Html,因为实

6、际上我们要真正来用HtmlParser的话,还需要特定的Visitor,而通过简单的这些系统提供的Visitor组合是难以做成什么事情的。三,系统Visitor功能简介:ObjectFindingVisitor:用来找出所有指定类型的节点,采用getTags()来获取结果。 StringBean:用来从一个指定的URL获取移除了和之间代码的Html代码,也可以用做Visitor,用来移除这两种标签内部的代码,采用StringBean.getStrings()来获取结果。 HtmlPage:提取Title,body中的节点和页面中的TableTag节点。 LinkFindingVisitor:找

7、出节点中包含某个链接的总个数。 StringFindingVisitor:找出遍历的TextNode中含有指定字符串的个数。 TagFindingVisitor:找出指定Tag的所有节点,可以指定多种类型。 TextExtractingVisitor:从网页中把所有标签去掉来提取文本,这个提取文本的Visitor有时是很实用的,只是注意在提取文本时将标签的属性也去掉了,也就是说只剩下标签之间的文本,例如中的链接也去掉了。 UrlModifyingVisitor:用来修改网页中的链接。 四,Filter如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信

8、息,这都取决于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。所以说要想用HtmlParser,首先要熟悉上面讲到的数据组织。系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用Visitor来访问。调用Filter的方法是:NodeList nodeList = myParser.parse

9、(someFilter);解析之后,我们可以采用:Node nodes = nodeList.toNodeArray();来获取节点数组,也可以直接访问:Node node = nodeList.elementAt(i)来获取Node。另 外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的extractAllNodesThatMatch (someFilter)来进一步过滤,同时又可以用NodeList的isitAllNodesWith(someVisitor)来做进一步的访问。这 样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不

10、同的应用可以采用visitor来遍历Html节点提取数据,也可 以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出我们所需要的信息。HTMLParser解析HTML实例开发中经常会用到对html文件的解析,特别是在做爬虫的时候,更是会很频繁的用到对html的解析htmlparser工具包,提供了对html进行解析的便利工程方法下在是使用htmlparser对html进行解析的实例.import org.htmlparser.Attribute;import org.htmlparser.Node;import org.htmlparser.Par

11、ser;import org.htmlparser.Tag;import org.htmlparser.tags.ScriptTag;import org.htmlparser.util.NodeList;import org.htmlparser.util.ParserException;public class dfdasfads public static void main(String args) throws ParserException StringBuffer sb = new StringBuffer(); sb.append(p1s2 name=s22vvvrn.rn.)

12、; System.out.println(new dfdasfads().getFilterBody(sb.toString(); public String getFilterBody(String strBody) / 一、 htmlparser 处理提交 Parser parser = Parser.createParser(strBody, utf-8); NodeList list; String reValue = strBody; try list = parser.parse(null); visitNodeList(list); reValue = list.toHtml()

13、; catch (ParserException e1) e1.printStackTrace(); return reValue; /* */* * 移除所有标签的Id属性 * param list 标签集合 */ private void visitNodeList(NodeList list) System.out.println(visitNodeList(list); for (int i = 0; i 0) visitNodeList(children); System.out.println(; System.out.println(new FilterBody().getFil

14、terBody(sttt); public String getFilterBody(String strBody) / 一、 htmlparser 处理提交 Parser parser = Parser.createParser(strBody, utf-8); NodeList list; String reValue = strBody;try list = parser.parse(null); visitNodeList(list); reValue = list.toHtml(); catch (ParserException e1) return reValue; / 递归 pr

15、ivate void visitNodeList(NodeList list) for (int i = 0; i 0) visitNodeList(children); / 获取tag private void visitTag(Tag tag) String tagName = tag.getTagName();if (tagName != null & tagName.equalsIgnoreCase(embed) tag.setEmptyXmlTag(false); tag.setAttribute(AllowNetworking, none); tag.setAttribute(Al

16、lowScriptAccess, never, ); tag.setEmptyXmlTag(true); Vector attrs = tag.getAttributesEx(); for (int i = 0; i attrs.size(); i+) Object obj = attrs.elementAt(i); if (obj != null & obj instanceof Attribute) visitAttribute(Attribute) obj, tag); / 获取tag属性 private void visitAttribute(Attribute attribute,

17、Tag tag) String attName = attribute.getName(); if (attName = null) attName = ; else attName = attName.trim().toLowerCase(); String tagName = tag.getTagName(); if (tagName = null) tagName = ; else tagName = tagName.trim().toLowerCase(); String tagValue = tag.getText(); if (tagValue = null) tagValue =

18、 ; else tagValue = tagValue.trim().toLowerCase(); String attribValue = attribute.getValue(); if (attribValue = null) attribValue = ; else attribValue = attribValue.trim().toLowerCase(); 我这次要介绍的是如何抽取正文,这部分是最为核心的因为如果不能很好的提取原有文章的内容和样式,那么搜索出来的东西 就会惨不忍睹根本就没有使用价值 在做正文抽取模块之前我曾经参考过很多抽取模式,有配置模版的,有搞视觉匹配的有搞关键字

19、识别的我挨个做了分析 首先配置摸版是不太现实的,因为我在搜索技术资讯的时候,根本不知道会搜索到哪个网站,也根本没精力去配置摸版所以这个行不通 基于视觉效果的分析,这个难度比较大,而且只适合于规范的网站,而现在很多网站根本不规范,广告链接漫天飞人家都把最好的 位置留给广告了而且我一直怀疑这个模式的可行性,它只是一个善意的推测所以这方面没做过多尝试 我在想,是否有种简单的方法呢?难道就没有什么共性吗? 我想所有的正文应该有个共同的特点,那就是正文的长度应该超过其他文字组合的长度很少会有一句话的正文,很少会有长度 短于标题的正文所以这个应该成为一个突破口 接下来,有一个很重要的问题,那段最长的正文在

20、哪里呢? 肯定是在一个TABLE,或者DIV,或者ParagraphTag里那好,那就找到那个包含文字最多的DIV或者TABLE 不过问题又来了,HTML页面,经常是HTML元素的长度超过了正文的长度,有时候混入了不少的JAVASCRIPT这些元素 HTMLPARSER经常会误认为是正文加以识别,导致很多正文竟然是一段JAVASCRIPT 祛除杂质是一个关键,这里面要把那些中常用的标签,以及连接中正文去除掉,否则,你搜索出来的很可能是别的什么,尤其 当正文文字相对较少的时候我在搜索SOHU页面的时候就经常遇到这个问题,原因是SOHU的页面不是严格按照DIV布局,里面有很多广告 的JAVASCR

21、IPT。新浪的有些页面也有这个现象,反到是一些中小网站的布局很规范,呵呵,真奇怪了。 做完这些工作后,我发现仍然有些网页不能正常抓取,原因是HTMLPARSER对TEXT的认识有问题例如一段文字在 ParagraphTag中或者span中包含的,就不能很好的识别所以要单独做个抽取ParagraphTag内容的函数 做完这些步骤后,有一个问题出来了就是正文中包含的图片,连接,粗体,正常的表格这些问题一个个的冒出来既然问题出来了 那就要一个个的解决解决了这些难题我的网站抓取文章的质量就大大的提高了85%的准确率,基本达到实用阶段我网站上的正文快照基本和原文保持一致 提供几个例子,大家可以看下原文和

22、我抓取的有多少不同 1. 这个是单纯获取正文的例子,其中有粗体标签和链接 2 这个是正文里混有图片和表格 我把抽取正文的部分代码和大家共享这些代码基本解决了我在上面列举出来的问题。包括正文中混有图片,连接,粗体,表格等。 大家要是有兴趣可以改造下这些代码 请大家重点看protected List extractHtml(Node nodeP, PageContext context, String siteUrl) 这个函数是正文抽取的入口。我的这些函数写的不是很规范,别笑话! /* * 收集HTML页面信息 调用抓取函数 按照自己的摸版 生成网页 * param url * param urlEncode */ pu

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1