note でエクスポートしたXMLをPythonで読みやすくしたい(その4)~XMLからhtmlへ~
さてさて。
こちらの続きです。
(1)XMLファイルを読み込む
(2)読み込んだデータを木構造でアクセスする
(3)木構造の1Elementを1行で表示する
(4)noteのエクスポートファイルでテスト
前回やったのはここまで。
今回は次のように置き換えてみます。
item → details
title → summary
タグ名をどうやって置き換えるのか。
if el.tag == 'item':
el.tag = 'details'
elif el.tag == 'title':
el.tag = 'summary'
これだけだった。
結局のところ、これを実行してみた。
import xml.etree.ElementTree as ET
tree = ET.parse('note-ayumi_kat-1.xml')
root = tree.getroot()
def element_to_html(level, el):
if el.tag == 'item':
el.tag = 'details'
elif el.tag == 'title':
el.tag = 'summary'
def tree_to_html(level, el):
element_to_html(level, el)
for child in el:
tree_to_html(level+1, child)
tree_to_html(1, root)
tree.write('note-ayumi_kat-1.html', method='html')
XMLファイル'note-ayumi_kat-1.xml'は、noteからエクスポートしたファイルそのままである。得られたhtmlファイルをブラウザで表示してみる。
細かいところはいろいろあるものの、概ね想定通りではある。
とは言うものの、サマリーを広げてもなんだかグチャグチャ。
どうなってんだろうとソースを表示してみる。
黄色マーカーの部分がXMLタグからhtmlタグに置き換えた箇所で、ここは問題ない。
問題は、
<summary></summary>タグの後の部分
だ。
青色マーカーの部分はまだXMLタグのままである。
このままではhtmlでは解さない。
ここをどうしようか。
とりあえず、全部「<li>」に置き換えてみる。
XMLのタグを捨ててしまうのも忍びないので、というか、日付情報などはいろんな種類もあるため、タグを捨ててしまうと何の日時かわからなくなるのではないかという懸念もある。ので、text の先頭に付与しようかと思う。
こんな感じ。
変更前
<dc:creator>AyumiKatayama</dc:creator>
変更後
<li>dc:creator<br>AyumiKatayama</li>
コードにするとこんな感じ。
el.text = el.tag + '<br>' + el.text
el.tag = 'li'
しかし。
怒られた。
el.text = el.tag + '<br>' + el.text
TypeError: can only concatenate str (not "NoneType") to str
「NoneType」?
以下の行を追加。
print("el.tag = ", el.tag)
print("'<br>' = ", '<br>')
print("el.text = ", el.text)
print("type(el.tag) = ", type(el.tag))
print("type('<br>') = ", type('<br>'))
print("type(el.text) = ", type(el.text))
結果はこうなった。
el.tag = rss
'<br>' = <br>
el.text = None
type(el.tag) = <class 'str'>
type('<br>') = <class 'str'>
type(el.text) = <class 'NoneType'>
Traceback (most recent call last):
el.text = el.tag + '<br>' + el.text
TypeError: can only concatenate str (not "NoneType") to str
エラーは、「rss」タグで発生した模様。
「rss」タグはXMLのトップタグで、始端タグはXMLファイルの先頭、終端タグはXMLファイルの末尾にある。始端~終端にある他のタグを全部除去すると次のようになる。
<rss version="2.0"></rss>
textは、次の「…」部分にあたる。
<tag>...</tag>
従って、「rss」タグにはtextがないことになる。
textがない場合、
text=""
ではなくて
text=None
であるらしい。
では、こうしてみる。
if el.text == None:
el.text = el.tag + '<br>'
else:
el.text = el.tag + '<br>' + el.text
el.tag = 'li'
結果はこんな感じ。
んんん。
「<br>」?
ソースを確認してみる。
ああ・・・。
先ほどの「el.text」をprintしてみるとどうなるのか。
「rss<br>」にはなっていない。
htmlで書き出すときに変換されたかなぁ。
はて。
どうかできるのだろうか。