crawler4j源码分析(四)Parser
来源:互联网 发布:python twisted下载 编辑:程序博客网 时间:2024/06/04 19:14
本节来分析crawler4j的parser,由于crawler4j本身也是个框架,把具体信息的抽取留给用户来完成,因此这里的parser所完成的工作,主要就是将从entity转换而来的字节流
转换成可供后面用户提取信息的形式,总体而言parser的主要工作是对html类型的页面转换,对于另外两种:二进制不作处理,文本方式(text/plain)的处理很简单,直接变成string放在TextParseData中即可。对应的存放解析结果的类分别为:BinaryParseData,TextParseData,HtmlParseData。这里我们重点分析最后一个类的解析。
HtmlParseData的成员包括:html,text,title,outgoingUrls,前三个为string,最后一个为List用于存放提取出的出链。htm页面放在第一个变量中,具体的解析主要通过tika的HtmlParser和自定义的继承自DefaultHandler的HtmlContentHandler来完成,HtmlContentHandler用于完成具体的解析工作,这里最主要的就是提取所有的超链接。因为Html页面的转换已经在parser类中完成(很简单,直接变成string即可)。这里我们具体谈谈HtmlContentHandler,在DefaultHandler中定义解析Html/XML时用到的基本接口,用户需要创建自己的类来具体实现这些接口,在自己的实现中来完成具体的解析工作,这些接口中最重要也是最常用的有:
startDocument()-----文档开始处被调用
endDocument()------文档结束处被调用
startElement (String uri, String localName,String qName, Attributes attributes)---------一个element开始时被调用
endElement (String uri, String localName, String qName)------------------一个element结束时被调用
characters (char ch[], int start, int length)----------------------------位于元素的内容中时被调用
上述函数参数含义如下:
uri:当前元素的名字空间
localName:当前元素的不带前缀名称
qName:当前元素的全程(限定名),即带前缀的名称
attributes:当前元素的所有属性
ch:存放当前元素value的数组.
start:当前元素value在数组ch中的起始索引
length:value的长度
从上面的几个接口可以看出,对具体的Html的解析就是根据自己的业务需求重写上面这些接口。在HtmlContentHandler类中,重写了最后三个接口,代码都很简单,这里就不再列出。最后所有的超链存放在outgoingUrls中,其成员为ExtractedUrlAnchorPair,这个类就两个成员:Href和archor
对于用户而言,可以在独立于crawler4j实现自己的抽取业务,然后在visit函数中调用Page类的getParseData接口获取HtmlParseData然后再通过接口getHtml来获取具体的Html作为自定义解析接口的输入。
至此crawler4j的parser就分析完了,下一节来分析一下crawler4j中一些支撑类如:对robots协议的支持,URL规范化的实现。
- crawler4j源码分析(四)Parser
- crawler4j源码分析(二)Frontier
- crawler4j源码分析(三)Fetcher
- crawler4j源码分析(五)Robots协议
- crawler4j源码分析(五)Robots协议
- crawler4j源码分析(一)CrawlController和WebCrawler
- 开源JAVA爬虫crawler4j源码分析 - 2 开始使用crawler4j
- EasyUI学习总结(四)——parser源码分析
- EasyUI学习总结(四)——parser源码分析
- EasyUI学习总结(四)——parser源码分析
- EasyUI学习总结(四)——parser源码分析
- Spiderman源码分析(五)Parser
- 开源JAVA爬虫crawler4j源码分析
- Expressbody-parser(四)
- easyui源码分析(parser.js)(3)
- 开源JAVA爬虫crawler4j源码分析 - 1 开个头
- 开源JAVA爬虫crawler4j源码分析 - 3 线程管理
- crawler4j源码解析
- [FOJ 2105][Vjudge 35179] Digits Count [线段树]
- ajax基础
- JavaScript学习笔记 第五记
- Android开发全程记录(十二)——ImageView 加边框的方法
- Java 多线程 原子性 Java编程思想读书笔记
- crawler4j源码分析(四)Parser
- python登陆Discuz!论坛通用代码
- php 解决MySQL插入数据出现 Incorrect string value: '\xF0\x9F\x92\x8BTi...'错误
- union关键字
- python try except else finally 执行顺序详细分析
- 数据结构学习12——快速排序
- [golang]自己动手实现ini文件读取
- JFreeChart的使用
- 为什么要使用SVN