見出し画像

note でエクスポートしたXMLをPythonで読みやすくしたい(その4)~XMLからhtmlへ~

さてさて。
こちらの続きです。

(1)XMLファイルを読み込む
(2)読み込んだデータを木構造でアクセスする
(3)木構造の1Elementを1行で表示する
(4)noteのエクスポートファイルでテスト

前回やったのはここまで。

今回は次のように置き換えてみます。

itemdetails
titlesummary

タグ名をどうやって置き換えるのか。

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ファイルをブラウザで表示してみる。

記事をhtmlのサマリーで表示

細かいところはいろいろあるものの、概ね想定通りではある。

とは言うものの、サマリーを広げてもなんだかグチャグチャ。

記事のサマリーを展開したところ

どうなってんだろうとソースを表示してみる。

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'

結果はこんな感じ。

summaryに変換後

んんん。
<br>」?

ソースを確認してみる。

summaryに変換後のhtmlソース

ああ・・・。

先ほどの「el.text」をprintしてみるとどうなるのか。

rss&lt;br&gt;」にはなっていない。

htmlで書き出すときに変換されたかなぁ。
はて。
どうかできるのだろうか。


この記事が気に入ったらサポートをしてみませんか?