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"))
La session vous show ne définit pas 'document'. – Svante
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 ... –
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. –