2011-01-18 2 views
1

J'essaie de rechercher du code HTML à l'aide du package cxml-stp, et d'échouer lamentablement.Utilisation de cxml-stp pour rechercher du code 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 

Je ne suis pas sûr de ce que je fais mal ici. La valeur de retour de cxml: parse semble tout à fait raisonnable, ce qui me porte à croire que j'appelle stp: find-récursivement et stp: filter-récursivement à tort.

Quelqu'un pourrait-il me diriger dans la bonne direction? Le docs dire que cela devrait fonctionner:

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

FWIW, je charge tous les paquets mon application a besoin par Quicklisp:

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

La session vous show ne définit pas 'document'. – Svante

+0

Wow, vous avez raison; Je ne peux pas croire que je n'ai pas vu ça ... comme c'est embarrassant. (document setq (cxml: parse ...)) et cela fonctionne. Je suppose que mes lunettes Lisp ne sont pas encore très bonnes ... –

+0

Pas que cela excuse mon oubli ou quoi que ce soit - mais en .NET-land, je me serais attendu à une ArgumentNullException ... mais ensuite, je peux voir comment cette chose s'appelle récursivement qu'il ne serait pas viable de lancer une exception pour un argument nul. –

Répondre

2

Works pour moi:

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")) 
+1

Merci - ouais, comme le fait remarquer Svante ci-dessus, cela aide si vous assignez réellement la valeur de retour de l'opération d'analyse à la variable que vous recherchez par la suite :-) –

Questions connexes