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

名前空間の問題でしょうか?つまりxmlns、ルートhtml要素に属性がある場合は、で名前空間を宣言しxpath:with-namespaces、XPath式で指定する必要があります。この式は、どの名前空間にも存在しない要素"//input"のみを検索します。input

于 2012-07-01T03:32:56.743 に答える