2012-07-01 59 views
1

我想爲特定輸入字段提取HTML頁面(以便我可以從中提取令牌以供在登錄期間使用)。我使用SBCL 1.0.54(因爲該版本正常工作與StumpWM),quicklisp和以下quicklisp包:在Common Lisp中使用XPath查找'輸入'標記

drakma 
closure-html 
cxml-stp 

如果我使用Drakma加載HTML頁面,並將其轉換爲有效的X(HTML ),我可以使用下面的代碼(寬鬆適應弗羅姆斑蝶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}> 

我顯然失去了一些東西基本相當這裏。有人能給我指向正確的方向嗎?

回答

2

它可能是一個命名空間問題?也就是說,如果根html元素上存​​在xmlns屬性,則需要用xpath:with-namespaces聲明名稱空間,並在XPath表達式中指定它。表達式"//input"只能找到不在任何名稱空間中的input元素。

+0

這確實是一個命名空間問題,謝謝:-)使用xpath-with-namespaces導致表達式按照我的預期行事。 –