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 readerEmacs内で読む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