天天看点

crawler4j源码分析(四)Parser

        本节来分析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规范化的实现。