xhtmlの整形

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()