XHTMLを整形するツールを探してみた。
こんなの http://d.hatena.ne.jp/atsam/20090118/1232273065があったので
Pythonでも
xml.etree.ElementTree.fromstring
で整形したいXHTMLを読み込んで、
xml.etree.ElementTree.tostring
で吐き出せば、きっと綺麗なコードが得られるだろう、考えた。
早速やってみて気づいたこと。
xml.etree.ElementTree.fromstringにはunicodeは渡せないようだ。xmlはわざわざ頭にエンコーディングを書くのだ。
fromstringはstrが渡されることを期待して当然だ。
xml.etree.ElementTreeは厳密すぎて、使いづらい。
が混じっていたりすると止まる。
どういうわけか でエラーになる。
そこで、BeautifulSoupを代わりに使ってみた。
こちらはElementTreeに比べ、崩れたxmlも柔軟に対応してくれるらしい。
実際のコード、コマンドライン引数に与えられたファイルを整形する。
from __future__ import with_statement, division, print_function import traceback from BeautifulSoup import BeautifulSoup def pretty(s): soup = BeautifulSoup(s) return soup.prettify().decode("utf-8") def main(): for f in sys.argv[1:]: try: with open(f) as fp: t = fp.read() os.rename(f, f + "~") p = pretty(t) with open(f, "w") as fp: fp.write(p.encode("utf-8")) except Exception as e: traceback.print_exc() print(e) raw_input() if __name__ == "__main__": main()