BeautifulSoup の代わりにElementTree を使ってみた(続き)

昨日の続き。
今度はxmlを読み書きする処理。
読む部分は BeautifulSoup とかなり似ていたので思ったより素直に直せた。
引っかかった点としては、

  • タグがない場合の返り値

タグの有無で処理を分岐させたくて

tag = parent.find('tagname').text

とした場合、BeautifulSoup では

if tag:
  タグがある場合の処理
else:
  タグがない場合の処理

で動いていたのだけど、ElementTree では

if tag != None :
  タグがある場合の処理
else:
  タグがない場合の処理

にしないといけなかった。

  • XML 中に数値が入ってくる場合

昨日も書いたようにファイルへの出力は tostring() を使ったのだけど、なぜかエラーで止まってしまった。スタックトレースのエラーメッセージによると、「int の値があったので解決しようと処理を呼んでる途中で、なんか解決できなかったよー」みたいな。日本語(UTF=8)が問題ではなかったので止まったあたりを確認したら、タグの属性値に数値を入れていたところっぽい。もともと

Element.set(‘attr_name’, val)

としていたところを

Element.set(‘attr_name’, str(val))

にすることで解決。
要素にバイナリって埋め込めるんだっけ?setする時点で怒られる方がわかりやすいのに。

  • find_all は findall ではなく iter

ElementTree のfind系は基本 root から探すらしいのと、子要素を繰り返し処理する場合は iter を呼ぶべきらしい。ドキュメントをちゃんと読もう。

ファイルの読み書きはできたので、後は ftp でサーバにアップする処理だ。