使用cxml-stp搜索HTML

时间:2011-01-18 07:20:23

标签: xml common-lisp

我正在尝试使用cxml-stp包搜索HTML,并且失败了。

* (cxml:parse "<html><body><table><tr><td/></tr><tr><td/></tr></table></body></html>" (stp:make-builder))

#.(CXML-STP-IMPL::DOCUMENT
   :CHILDREN '(#.(CXML-STP:ELEMENT
                  #| :PARENT of type DOCUMENT |#
                  :CHILDREN '(#.(CXML-STP:ELEMENT
                                 #| :PARENT of type ELEMENT |#
                                 :CHILDREN '(#.(CXML-STP:ELEMENT
                                                #| :PARENT of type ELEMENT |#
                                                :CHILDREN '(#.(CXML-STP:ELEMENT
                                                               #| :PARENT of type ELEMENT |#
                                                               :CHILDREN '(#.(CXML-STP:ELEMENT
                                                                              #| :PARENT of type ELEMENT |#
                                                                              :LOCAL-NAME "td"))
                                                               :LOCAL-NAME "tr")
                                                            #.(CXML-STP:ELEMENT
                                                               #| :PARENT of type ELEMENT |#
                                                               :CHILDREN '(#.(CXML-STP:ELEMENT
                                                                              #| :PARENT of type ELEMENT |#
                                                                              :LOCAL-NAME "td"))
                                                               :LOCAL-NAME "tr"))
                                                :LOCAL-NAME "table"))
                                 :LOCAL-NAME "body"))
                  :LOCAL-NAME "html")))
* (stp:find-recursively (stp:of-name "td") document)

NIL
* (stp:filter-recursively (stp:of-name "td") document)

NIL

我不太确定我在这里做错了什么。 cxml:parse的返回值似乎完全合理,这让我相信我正在调用stp:find-recursively和stp:filter-recursively错误。

有人可以指出我正确的方向吗? docs说这应该有效:

(stp:filter-recursively (stp:of-name "foo") node)

FWIW,我正在通过Quicklisp加载我的应用程序所需的所有软件包:

(ql:quickload '("drakma" "closure-html" "cxml-stp"))

1 个答案:

答案 0 :(得分:2)

适合我:

CL-USER> (stp:filter-recursively (stp:of-name "td") (cxml:parse "<html><body><table><tr><td/></tr><tr><td/></tr></table></body></html>" (stp:make-builder)))

(#.(CXML-STP:ELEMENT #| :PARENT of type ELEMENT |# :LOCAL-NAME "td")
 #.(CXML-STP:ELEMENT #| :PARENT of type ELEMENT |# :LOCAL-NAME "td"))