note でエクスポートしたXMLをPythonで読みやすくしたい(その6)
さてさてさてさて。
いよいよプログラミング実況中継風になってきました(笑)。
それもいいかも。
こちらの続きです。
(1)XMLファイルを読み込む
(2)読み込んだデータを木構造でアクセスする
(3)木構造の1Elementを1行で表示する
(4)noteのエクスポートファイルでテスト
(5)タグを置換
item → details
title → summary
その他 → li
(6)Element.text を Element に格上げしようとして失敗。デバッグ中。
前回やったのはここまで。
『(6)Element.text を Element に格上げしよう』
をなんとか成功・・・できるのか。
noteでエクスポートしたXMLは、過去に書いた記事を含んでいる。それらの記事は当然のことながら html で記載されていて、エクスポートされたXMLは次のようになっている。
Element.tag が content:encoded
Element.text が記事内容
その text の記事内容は、もちろん html フォーマットである。
例えば、note 記事に
課題
のように見出しを書いたら、text には
<h2>課題</h2>
のような文字列が入っているわけだ。
XMLは、これを
課題
ではなく
<h2>課題</h2>
というように表示しようする。
結果、このような文字列に置き換えられてしまう。
<h2>課題</h2>
htmlソースを読みたいわけではないので、
<h2>課題</h2>
ではなく
<h2>課題</h2>
で出力したい。
たが、上手くいかない。
というのが、前回まで。
そもそも、XML に htmlフォーマットのテキストを解析させていることに無理があるように思えないでもない。
PythonにはXMLを解析するライブラリがあるくらいだもの、htmlだってあるんじゃね?
ということでこちらのPythonドキュメント『Python 標準ライブラリ』で探してみた。
ここで「html」を検索すると、あっさり出できたのである。
これこれ。
なので、変更してみた。
変更前
sub_tree = ET.XML(el.text)
変更後
from html.parser import HTMLParser
parser = HTMLParser()
sub_tree = ET.XML(el.text, parser)
import の位置は適当に調整するとして、要するに、
ElementTree の parser を html のものに置き換える
ということになる。
すると、前回あれだけドタバタした状況が一転、エラーなしであっさり通ってしまったのである。
そうすれば、前回修正したものも戻しておこう。
el.text = '<p>' + el.tag + ' ' + el.text + '</p>'
↓
el.text = '<p>' + el.tag + '<br>' + el.text + '</p>'
この時点では text を変換しただけで xml の tree は置き換えていない。
どうやって置き換える?
再び、「Element」のドキュメントを読んでみる。
すると・・・。
これか。
よし!
これを追加して・・・。
el.append(sub_tree)
実行~!
el.append(sub_tree)
TypeError: append() argument must be xml.etree.ElementTree.Element, not None
ん?
んんん?
引数は None はダメ?
え?
いや。
だから「sub_tree」を指定してるやん。
「sub_tree」はいったいどうなっとるんや。
text= <p>rss</p>
sub_tree= None
type(sub_tree)= <class 'NoneType'>
なんもなし?
はぁ?
どーゆーこと?
HTMLParser ってなんぞや。
では、XMLParserは?
あー。
HTMLParserでは、Tree は作っていないのかぁ。
というか、もしかして空っぽ?
html も Tree にできないでもないだろうけど、 Tree の要求は大きくない。
かもしれない。
うーん、うーん、うーん。
どうすべ。
HTMLParser を継承して・・・、
TreeBuilder を使用・・・する?・・・というか、できる?
結構、大がかりになってくる?
そもそも、それが最短距離なのか?
代替案はあるのか?
・・・。
どうでもいいけど、Pythonって戻り値に何が返ってくるのか、わかりにくくね?
(つづく)
この記事が気に入ったらサポートをしてみませんか?