昨日の続き。
今度は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 でサーバにアップする処理だ。