我正在尝试为特定输入字段抓取HTML页面(以便我可以从中提取令牌以便在登录时使用)。我正在使用SBCL 1.0.54(因为该版本适用于StumpWM),quicklisp以及以下quicklisp包:
drakma
closure-html
cxml-stp
如果我使用Drakma加载HTML页面并将其转换为有效的X(HTML),我可以使用以下代码(松散地适应Plexippus XPath示例):
(xpath:do-node-set (node (xpath:evaluate "//*" xhtml-tree))
(format t "found element: ~A~%"
(xpath-protocol:local-name node)))
...获取以下结果(为简洁而剪裁;相关页面为 large ):
found element: img
found element: a
found element: img
found element: script
found element: div
found element: img
found element: a
found element: input
found element: input
但是我似乎无法使任何XPath语句比“// *”更正常工作。我的目标是找到一个具有特定名称的输入,但即使只找到所有输入也会失败:
* (xpath:evaluate "//input" xhtml-tree)
#<XPATH:NODE-SET empty {10087146F3}>
我显然遗漏了一些非常基本的东西。有人可以给我指向正确的方向吗?
答案 0 :(得分:2)
可能是命名空间问题吗?也就是说,如果根xmlns
元素上存在html
属性,则需要使用xpath:with-namespaces
声明命名空间,并在XPath表达式中指定它。表达式"//input"
仅查找不在任何名称空间中的input
个元素。