Skip to content

Instantly share code, notes, and snippets.

@miyamuko
Created July 29, 2010 07:48
Show Gist options
  • Select an option

  • Save miyamuko/497543 to your computer and use it in GitHub Desktop.

Select an option

Save miyamuko/497543 to your computer and use it in GitHub Desktop.
xyzzy + htmlfile + JavaScript-XPath で XPath
;; xyzzy + htmlfile + JavaScript-XPath で XPath
;;
;; See:
;; http://d.hatena.ne.jp/amachang/20071112/1194856493
;; http://d.hatena.ne.jp/mobitan/20090829/1251542456#20090829f10
(require "xml-http-request")
(defparameter *javascript-xpath-uri*
"http://svn.coderepos.org/share/lang/javascript/javascript-xpath/trunk/release/javascript-xpath-latest-cmp.js")
(defparameter *javascript-xpath-src*
(xhr:xhr-get *javascript-xpath-uri*
:key 'xhr:xhr-response-text))
(defparameter *doc* (ole-create-object "htmlfile"))
(defparameter *win* (ole-getprop *doc* :parentWindow))
(defparameter *html* (xhr:xhr-get "http://gist.github.com/gists"
:key 'xhr:xhr-response-text))
(ole-method *doc* :Write *html*)
(ole-method *win* :eval *javascript-xpath-src*)
; JavaScript-XPath をちゃんと読みこめているか確認
; (ole-method *win* :eval "alert(document.evaluate)")
(defparameter *xpath* "//div[@class='info']/span/a")
; なぜかエラーになる
; (defparameter *result*
; (ole-method *doc* "evaluate" *xpath* *doc* nil 7 nil))
;; => Undocumented win32 error: -2147352319: :evaluate
;; XPath を評価して結果を得る
(defparameter *result*
(ole-method *win* :eval (format nil "document.evaluate(~S, document, null, 7, null)" *xpath*)))
;; XPath の結果の数
(defparameter *length*
(ole-method *result* :snapshotLength))
;; XPath の結果を出力
(dotimes (i *length*)
(let ((obj (ole-method *result* :snapshotItem i)))
(unless obj
(return))
(insert (ole-method obj :innerHTML) #\LFD)))
;; XPath の結果を出力 (loop マクロを使ってみた)
(require "cmu_loop")
(dolist (obj (loop for i from 0 below *length*
collect (ole-method *result* :snapshotItem i)))
(insert (ole-method obj :innerHTML) #\LFD))
;=> gist: 497391
; gist: 497390
; gist: 497388
; :
; nil
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment