1

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

...获得以下结果(为简洁起见被剪断;有问题的页面很大):

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}>

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

4

1 回答 1

2

会不会是命名空间问题?也就是说,如果xmlnshtml元素上有一个属性,那么您需要声明命名空间xpath:with-namespaces并在 XPath 表达式中指定它。该表达式"//input"仅查找input不在任何命名空间中的元素。

于 2012-07-01T03:32:56.743 回答