绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
HTML解析器——htmlparser2使用详解,换个姿势解析html和xml
2020-01-16 17:27:43

用法简介

安装

const { Parser } = require('htmlparser2');const parser = new Parser(handler, options);parser.parseComplete('html/xml内容');

写法

const { Parser } = require('htmlparser2');const parser = new Parser(handler, options);parser.parseComplete('html/xml内容');

htmlparser2提供了一个解析器——Parser,初始化它至少需要一个handler,options是可选的。

handler是一个对象,在这个对象上可以设置很多的钩子函数,Parser解析时会在每个阶段运行对应的钩子函数。

以下是可以设置的所有的钩子函数,

  • onopentag(<str> name, <obj> attributes)
  • onopentagname(<str> name)
  • onattribute(<str> name, <str> value)
  • ontext(<str> text)
  • onclosetag(<str> name)
  • onprocessinginstruction(<str> name, <str> data)
  • oncomment(<str> data)
  • oncommentend()
  • oncdatastart()
  • oncdataend()
  • onerror(<err> error)
  • onreset()
  • onend()
  • htmlparser模块是通过正则表达式来解析html内容的,而htmlparser2则不同,它会按顺序读取html的每个字符,并且推测后面字符是标签名、属性还是其他的类型,所以htmlparser2在解析完每一个标签后都会运行相应的钩子函数。

    先来看一下例子,

    HTML解析器——htmlparser2使用详解,换个姿势解析html和xml

    图1

    图1中设置了所有的钩子函数以便来说明每个钩子函数的作用,运行一下,

    HTML解析器——htmlparser2使用详解,换个姿势解析html和xml

    图2

    对照图1和图2就能看出来每个钩子函数的运行时机,这其中有以下几个钩子函数需要注意一下。

    • oncdatastart和oncdataend会在解析<![CDATA[文本]]>标签时触发,但是触发的前提是选项设置了recognizeCDATA=true或者xmlMode=true;
    • onprocessinginstruction会在解析<!xxyy>或者<?xxyy>这样的标签时触发,xx和yy中间可以有分隔符(斜杠或者空格),分隔符前面的字符串就是钩子函数中的name的值;
    • 运行parseComplete方法会执行reset钩子函数,如果仅仅执行parser的write或者end方法并不会执行reset方法。

    除了自定义handler以外,htmlparser2还提供了几个handler,比如DomHandler,用法如下:

    HTML解析器——htmlparser2使用详解,换个姿势解析html和xml

    图3

    运行一下,我们看看结果,

    HTML解析器——htmlparser2使用详解,换个姿势解析html和xml

    图4

    如果4所示,DomHandler处理的结果是以数组的形式输出的,在每个单元数据中还可以拿到上一个、下一个以及父节点的数据。

    htmlparser2还可以通过操作流Stream解析内容,写法如下:

    HTML解析器——htmlparser2使用详解,换个姿势解析html和xml

    图5

    总结

    这篇文章和上一篇是姊妹篇,都是介绍解析html/xml内容的模块,通过对比,我们发现htmlparser2模块功能更强大一些,也更灵活一些,同时也兼容htmlparser模块的一些接口。虽然两者功能类似,但是这给了我们更多的选择性。

    分享好友

    分享这个小栈给你的朋友们,一起进步吧。

    hello前端
    创建时间:2019-08-15 10:18:09
    前度开发学习中的个人总结
    展开
    订阅须知

    • 所有用户可根据关注领域订阅专区或所有专区

    • 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

    • 专区发布评论属默认订阅所评论专区(除付费小栈外)

    栈主、嘉宾

    查看更多
    • zyl
      栈主
    • 栈栈
      嘉宾
    • 渔人
      嘉宾
    • Giao
      嘉宾

    小栈成员

    查看更多
    • ?
    • daisyplay
    • youou
    • wojiuzhuai
    戳我,来吐槽~