在Common Lisp中使用XPath查找“input”标签

时间:2012-07-01 03:22:20

标签: xpath common-lisp

我正在尝试为特定输入字段抓取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}>

我显然遗漏了一些非常基本的东西。有人可以给我指向正确的方向吗?

1 个答案:

答案 0 :(得分:2)

可能是命名空间问题吗?也就是说,如果根xmlns元素上存在html属性,则需要使用xpath:with-namespaces声明命名空间,并在XPath表达式中指定它。表达式"//input"仅查找不在任何名称空间中的input个元素。