--- title: ClojureでJsoupをラップしてみた tags: Clojure author: emanon_was slide: false --- # スクレイピング Clojureでスクレイピングといえば既に`Enlive`があるのだけれど jQueryライクな表記はClojureのシンボルでは限界あるので ひとまずJavaのライブラリであるところの`Jsoup`をラップしてみた [emanon-was/cljsoup](https://github.com/emanon-was/cljsoup "emanon-was/cljsoup") # 使ってみる 1 . 準備 ```clj user> (use 'cljsoup.core) nil ``` 2 . URLから取ってきたHTMLをparseする ```clj user> (def x (parse (url "https://github.com"))) #'user/x user> x # ... > ``` 3 . Javaのクラスのままでは扱いにくいのでマッピングする ```clj user> (nodes x) ({:type :dtd, :data ["html" "" ""]} "\n" {:tag :html, ...}) ``` 4 . CSSセレクタを使う ```clj user> (select x "input[type=text][name=q]") (#) user> (nodes (select x "input[type=text][name=q]")) ({:tag :input, :attrs {:type "text", :data-hotkey "/ s", :name "q", ...}) ``` 5 . 手続き的に属性(今回はname)を取ってくる ```clj user> (-> x (select "input[type=text]") (attr "name")) ("q" "user[login]" "user[email]") ``` 6 . HTMLを編集する(要素の直後に<div>test</div>を挿入) ```clj user> (transform x "input[type=text]" (append (html [:div "test"]))) # ... > ``` 7 . Javaのクラスから文字列に戻す ```clj user> (parse x) " \n \n