HTMLをS式に変換する : html-parse.el
XMLをS式に変換するxml-parse.elというものがあるのですが、これをHTMLでも使えるように改造してみました。
# 元々xml-parse.elは、対象がhtml文章でも変換はできちゃうけど、結果はやはりおかしくなる。
html-parse.elの使用方法は、xml-parse.elと同様で、ポイント下のHTML文章を変換します。
以下のようなHTML文章の場合、最初の「<」直下にポイントを置き、html-parse-readを実行すれば良いだけです。
# html-parse-readはinteractiveな関数ではないので、M-xからは実行できません。
<html> <p>foo</p> <p><span style="font-weight:bold">bar</span></p> foo<br> </html>
結果、以下のようなリストを得る事ができます。
("html" ("p" "foo") ("p" (("span" ("style" . "font-weight:bold"))"bar")) "foo" ("br"))
ファイルは、EmacsWikiに置きました。といっても、コードのほとんどは、xml-parse.elからの流用だったりしますが…。
たぶん、HTMLソース内にjavascriptコードあたりが入ってると上手く動かない気がします。
あっ、使用するには、xml-parse.elが必要です。
Emacsからは、両者をロードパスの通った所に置き、(require 'html-parse)をするだけです。
あんまりテストしてないですが、とりあえず公開します。
元々は、livedoor readerをEmacs内で読むelispを作ってたときに、xml-parse.elをそのまま使うんじゃやっぱり…だなあとか思っていじってたのがはじまりだったりします。
あと、内部で再帰呼び出しがあるので、max-lisp-eval-depthの値を大きめにしておかないと、ちょっと大きなHTMLを渡すとすぐにエラー吐くと思います。
追記
コメント欄で指摘がありました。liなど必ずしも閉じる必要のないタグ、が混じると解析結果がおかしくなります。
対応するまでは、「開いたタグは閉じてあるという事を期待する」という事をこのelispの仕様とします。申し分けないです。
# とりあえず、liとdt、ddに対応かなあ…。どうせだから、html内にjavascriptがあっても出来る限り大丈夫なようにしたいなあ…。
更新時刻
- 2009/07/23/00:40
- 2009/07/23/22:03