最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Jsoup代码解读之五-parser(中)_html/css

来源:动视网 责编:小采 时间:2020-11-27 16:37:05
文档

Jsoup代码解读之五-parser(中)_html/css

Jsoup代码解读之五-parser(中)_html/css_WEB-ITnose:代码结构 先介绍以下parser包里的主要类: Parser Jsoup parser的入口facade,封装了常用的parse静态方法。可以设置maxErrors,用于收集错误记录,默认是0,即不收集。与之相关的类有ParseError,ParseErrorList。基于这个功能,我写了一个
推荐度:
导读Jsoup代码解读之五-parser(中)_html/css_WEB-ITnose:代码结构 先介绍以下parser包里的主要类: Parser Jsoup parser的入口facade,封装了常用的parse静态方法。可以设置maxErrors,用于收集错误记录,默认是0,即不收集。与之相关的类有ParseError,ParseErrorList。基于这个功能,我写了一个

代码结构

先介绍以下parser包里的主要类:

  • Parser
  • Jsoup parser的入口facade,封装了常用的parse静态方法。可以设置maxErrors,用于收集错误记录,默认是0,即不收集。与之相关的类有ParseError,ParseErrorList。基于这个功能,我写了一个PageErrorChecker来对页面做语法检查,并输出语法错误。

  • Token
  • 保存单个的词法分析结果。Token是一个抽象类,它的实现有Doctype,StartTag,EndTag,Comment,Character,EOF6种,对应6种词法类型。

  • Tokeniser
  • 保存词法分析过程的状态及结果。比较重要的两个字段是state和emitPending,前者保存状态,后者保存输出。其次还有tagPending/doctypePending/commentPending,保存还没有填充完整的Token。

  • CharacterReader
  • 对读取字符的逻辑的封装,用于Tokenize时候的字符输入。CharacterReader包含了类似NIO里ByteBuffer的consume()、unconsume()、mark()、rewindToMark(),还有高级的consumeTo()这样的用法。

  • TokeniserState
  • 用枚举实现的词法分析状态机。

  • HtmlTreeBuilder
  • 语法分析,通过token构建DOM树的类。

  • HtmlTreeBuilderState
  • 语法分析状态机。

  • TokenQueue
  • 虽然披了个Token的马甲,其实是在query的时候用到,留到select部分再讲。

    词法分析状态机

    现在我们来讲讲HTML的词法分析过程。这里借用一下http://ued.ctrip.com/blog/?p=3295里的图,图中描述了一个Tag标签的状态转移过程,

    这里忽略了HTML注释、实体以及属性,只保留基本的开始/结束标签,例如下面的HTML:

    test

    Jsoup里词法分析比较复杂,我从里面抽取出了对应的部分,就成了我们的miniSoupLexer(这里省略了部分代码,完整代码可以看这里MiniSoupTokeniserState):

    enum MiniSoupTokeniserState implements ITokeniserState { /** * 什么层级都没有的状态 * ? * test * ? * test */ Data { // in data state, gather characters until a character reference or tag is found public void read(Tokeniser t, CharacterReader r) { switch (r.current()) { case '<': t.advanceTransition(TagOpen); break; case eof: t.emit(new Token.EOF()); break; default: String data = r.consumeToAny('&', '<', nullChar); t.emit(data); break; } } }, /** * ? * test */ TagOpen { ... }, /** * ? * test */ EndTagOpen { ... }, /** * ? * test */ TagName { ... };}

    参考这个程序,可以看到Jsoup的词法分析的大致思路。分析器本身的编写是比较繁琐的过程,涉及属性值(区分单双引号)、DocType、注释、HTML实体,以及一些错误情况。不过了解了其思路,代码实现也是按部就班的过程。

    下一节开始介绍语法分析部分。

    最后还是附上我的Jsoup解读系列文章及代码地址:

    https://github.com/code4craft/jsoup-learning

    文档

    Jsoup代码解读之五-parser(中)_html/css

    Jsoup代码解读之五-parser(中)_html/css_WEB-ITnose:代码结构 先介绍以下parser包里的主要类: Parser Jsoup parser的入口facade,封装了常用的parse静态方法。可以设置maxErrors,用于收集错误记录,默认是0,即不收集。与之相关的类有ParseError,ParseErrorList。基于这个功能,我写了一个
    推荐度:
    标签: html css web
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top