#:g1: cl-rssの紹介

Posted 2014-04-17 16:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の108日目です。

cl-rssとはなにか

 cl-rssは、Kevin M. Rosenberg氏作のRSS 2.0をパーズしてCLOSのオブジェクトにしてくれるライブラリです。

パッケージ情報

パッケージ名cl-rss
Quicklisp
参考サイト
CLiKihttp://cliki.net/cl-rss
Quickdocshttp://quickdocs.org/cl-rss

インストール方法

(ql:quickload :rss)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 ライブラリにはサンプル的にrss:show-sitesが定義されているので、この辺りをいじってみると使い方が分かります。
rss:show-sitesだと、タイトルのみなので、リンクのURLも表示するように改造してみます。
rss:rss-itemは

(*:slot-names (find-class 'rss-item))
;=>  (TITLE LINK DESCRIPTION PUB-DATE)

のような感じになっています。

(defun show-sites/ (&optional (sites *sites*))
  (dolist (site (mklist sites))
    (awhen (rss-site site)
           (display-site/ it))))

(defun display-site/ (site &key (stream *standard-output*)) (format stream "Site: ~A~%" (title site)) (dolist (item (items site)) (format stream " ~A~%~4T~A~2%" (title item) (link item))))

(show-sites/ '("http://www.reddit.com/r/lisp/.rss")) ;>> Site: Lisp ;>> Fear of Macros ;>> http://www.reddit.com/r/lisp/comments/239ee3/fear_of_macros/ ;>> ;>> Dylan 2016: Evolving Dylan ;>> http://www.reddit.com/r/lisp/comments/239r8i/dylan_2016_evolving_dylan/ ;>> ;>> {} descriptions is a meta level descriptions library for Common Lisp. ;>> http://www.reddit.com/r/lisp/comments/238zj2/descriptions_is_a_meta_level_descriptions_library/ ;>> ;>> Noobtuts - Two Clojure Math Tutorials ;>> http://www.reddit.com/r/lisp/comments/239j9o/noobtuts_two_clojure_math_tutorials/ ;>> ;>> The Fate of "The ANSI Common Lisp Reference Book" ;>> http://www.reddit.com/r/lisp/comments/236xta/the_fate_of_the_ansi_common_lisp_reference_book/ ;>> ;>> Common Lisp implemented in Emacs Lisp ;>> http://www.reddit.com/r/lisp/comments/235uii/common_lisp_implemented_in_emacs_lisp/ ;>> ;>> Babel2 ;>> http://www.reddit.com/r/lisp/comments/233mkx/babel2/ ;>> ;>> The Paren Programming Language now supports threads. ;>> http://www.reddit.com/r/lisp/comments/233d3t/the_paren_programming_language_now_supports/ ;>> ;>> Nullable objects in Common Lisp? ;>> http://www.reddit.com/r/lisp/comments/22xn03/nullable_objects_in_common_lisp/ ;>> ;>> OSX GUI tutorial ;>> http://www.reddit.com/r/lisp/comments/22wwko/osx_gui_tutorial/ ;>> ;>> Strange sbcl/cffi behaviour ;>> http://www.reddit.com/r/lisp/comments/22wywo/strange_sbclcffi_behaviour/ ;>> ;>> Puppet Labs move to Clojure ;>> http://www.reddit.com/r/lisp/comments/22wdct/puppet_labs_move_to_clojure/ ;>> ;>> Meagan Waller - Conditional binding in Clojure ;>> http://www.reddit.com/r/lisp/comments/22ts2k/meagan_waller_conditional_binding_in_clojure/ ;>> ;>> Interview with Stuart Halloway, author of 'Programming Clojure' ;>> http://www.reddit.com/r/lisp/comments/22om7e/interview_with_stuart_halloway_author_of/ ;>> ;>> Whatever became of CLIM? ;>> http://www.reddit.com/r/lisp/comments/22lbpe/whatever_became_of_clim/ ;>> ;>> Lisp interface library: video presentation ;>> http://www.reddit.com/r/lisp/comments/22i9v7/lisp_interface_library_video_presentation/ ;>> ;>> Clojure Cookbook has arrived ;>> http://www.reddit.com/r/lisp/comments/22a1q3/clojure_cookbook_has_arrived/ ;>> ;>> Cache friendly memory management? ;>> http://www.reddit.com/r/lisp/comments/2283i0/cache_friendly_memory_management/ ;>> ;>> Octopus ;>> http://www.reddit.com/r/lisp/comments/22710w/octopus/ ;>> ;>> Lisp Aha! moments ;>> http://www.reddit.com/r/lisp/comments/2235wt/lisp_aha_moments/ ;>> ;>> SLIME User Manual version 2.5 (PDF) ;>> http://www.reddit.com/r/lisp/comments/2235zh/slime_user_manual_version_25_pdf/ ;>> ;>> SBCL Release Versions ;>> http://www.reddit.com/r/lisp/comments/2242jf/sbcl_release_versions/ ;>> ;>> Hashtable variant of (describe) ;>> http://www.reddit.com/r/lisp/comments/224oo2/hashtable_variant_of_describe/ ;>> ;>> Real World Clojure ;>> http://www.reddit.com/r/lisp/comments/222pl9/real_world_clojure/ ;>> ;>> Wasn't there something about indentation tuning with Slime recently? ;>> http://www.reddit.com/r/lisp/comments/220ehs/wasnt_there_something_about_indentation_tuning/ ;>> ;>> ;=> NIL

 ちなみに、parse-rss-streamの中のparse-channel-childがコケてrss-parse-errorを上げますが、今回はCL:IGNORE-ERRORSで囲んでスルーします。

(defun parse-rss-stream
  ...
  (map nil (lambda (child) 
             (ignore-errors
               (parse-channel-child child rss strict?)))
       (xmls:xmlrep-children channel))
  ...)

また、処理系によって、net.aserve.client:do-http-requestの文字化けが良く分からないという場合は、drakma:http-requestに差し替えるのも手かもしれません。

まとめ

 今回は、cl-rssを紹介してみました。
ライブラリを修正するより自作した方が早いという人もいるかもしれません。

comments powered by Disqus