zubat
1 基本类型
maybe/  c
2 解析它!
2.1 inport->html
2.2 file->sxml
3 元素解析
3.1 元素属性
zubat:  attr
zubat:  attr?
zubat:  text
zubat:  tag
zubat:  id
zubat:  class
zubat:  class?
3.2 元素查找
zubat:  children
zubat:  child?
zubat:  child
zubat:  all
zubat:  select
zubat:  select-first
zubat:  select-id
zubat:  parent
zubat:  ancestor
zubat:  siblings
6.12

zubat

XG.Ley

 (require zubat) package: zubat

纵观现有的库,尚未发现能足够好用地解析HTML5页面,sxml是一个XML解析库,它提供了基本方法,一些HTML5特有的解析方式却需要重新实现。

sxml的基础上,实现了一些比较常用的功能,例如document.getElementById。需要注意的是,zubat并没有document.querySelector,因为我没有css selector解析库。

1 基本类型

procedure

(maybe/c a)  (or/c #f any/c)

  a : any/c
Maybe类型,一个值可能为空(#f)或是其它值(any/c)。

除此之外,还有一些其它库中包含的类型,主要以sxml为主。

2 解析它!

zubat解析利用html-parsing这个库进行解析。

2.1 inport->html

将一个input-port转换成sxml

(inport->sxml (open-input-string "<div>text</div>"))
'(*TOP* (div "text"))

2.2 file->sxml

将本地文件直接解析成sxml

(file->sxml "sample.html")

3 元素解析

zubat只提供解析功能,并没有修改、删除功能。

3.1 元素属性

procedure

(zubat:attr attr el)  (maybe/c string?)

  attr : symbol?
  el : sxml:element?
查找元素某个属性。

(define el '(main (@ (id "main-id")) "main text"))
(zubat:attr 'id el) ;; -> "main-id"

procedure

(zubat:attr? att el)  boolean?

  att : symbol?
  el : sxml:element?
元素是否存在某个属性。

(define el '(main (@ (id "main-id")) "main text"))
(zubat:attr? 'id el) ;; #t
(zubat:attr? 'class el) ;; #f

procedure

(zubat:text el)  string?

  el : sxml:element?
元素文本。

(define el '(main (@ (id "main-id")) "main text"))
(zubat:text el) ;; "main text"

procedure

(zubat:tag el)  string?

  el : sxml:element?
元素标签名称。

(define el '(main (@ (id "main-id")) "main text"))
(zubat:tag el) ;; "main"

procedure

(zubat:id el)  (maybe/c string?)

  el : sxml:element?
获取元素的id,id可能不存在,所以可能会返回#f

(define el '(main (@ (id "main-id")) "main text"))
(zubat:id el) ;; "main-id"

procedure

(zubat:class el)  (listof string?)

  el : sxml:element?
获取元素class,以列表形式输出。

(define el '(div (@ (class "button")) "primary button"))
(zubat:class el) ;; '("button")

procedure

(zubat:class? name el)  boolean?

  name : string?
  el : sxml:element?
元素是否包含某个class。

(define el '(div (@ (class "button")) "primary button"))
(zubat:class? "button" el) ;; #t
(zubat:class? "input" el) ;; #f

3.2 元素查找

procedure

(zubat:children root)  nodeset?

  root : (or/c empty? sxml:element?)
获取该元素下一级的所有子元素。

procedure

(zubat:child? root)  boolean?

  root : sxml:element?
该元素下是否有子元素。

procedure

(zubat:child root)  (maybe/c sxml:element?)

  root : sxml:element?
获取第一个子元素。

procedure

(zubat:all root)  nodeset?

  root : sxml:elements?
获取所有子元素,与zubat:children不同在于,它递归得到每个元素的子元素,之后得到一条包含所有子元素的列表。

procedure

(zubat:select f root)  (listof sxml:element?)

  f : (-> sxml:element? boolean?)
  root : sxml:element?
从所有子元素中过滤所需要的元素。

procedure

(zubat:select-first f root)  (maybe/c sxml:element?)

  f : (-> sxml:element? boolean?)
  root : sxml:element?
从所有子元素中过滤得到第一个元素。

procedure

(zubat:select-id id root)  (maybe/c sxml:element?)

  id : string?
  root : sxml:element?
传说中的getElementById

procedure

(zubat:parent root el)  (maybe/c sxml:element?)

  root : sxml:element?
  el : sxml:element?
元素的上一级元素。

procedure

(zubat:ancestor root el)  (listof sxml:element?)

  root : sxml:element?
  el : sxml:element?
元素的递归上级元素,即祖先链。

procedure

(zubat:siblings root el)  (listof sxml:element?)

  root : sxml:element?
  el : sxml:element?
同级元素。