python BeautifulSoup4 でhtml出力

数日前にEpic Games Storeから無料配布されたプログラミングゲーム『Human Resource Machine』にハマって、2日でクリアしてしまったのですが、プレイしながら「ていうか、ゲームじゃなくって実用的なプラグラムが書きてぇ」と思いまして。
で、いつもですとPerlで書くのですが、「時代はPythonだろっ!」っと思い立って、思い立ったが元日(それを言うなら吉日)ということで、初めてPythonでプログラミングしました。

import glob
import shutil

filepath = 'e:/data/python/data/raw/*.zip'
flist = glob.glob(filepath)
for file in flist:
    shutil.unpack_archive(file, 'e:/data/python/data/raw/')

pathの指定方法からお察しの通り、Windowsです。指定したフォルダのzipファイルを全部解凍するだけのスクリプトです。
最初ですから、こんなもんでしょう。

import glob
import shutil
import os

flist = glob.glob('e:/data/*.txt')
for datefile in flist:
    make_zip = shutil.make_archive(datefile[0:-4],format="zip",base_dir=datefile)
    shutil.move(make_zip, 'e:/data/zip/')
    os.remove(datefile)

ディレクトリ内の全てのテキストファイルを個別にzip化して、別のフォルダへ移動して、元のテキストファイルを消します。

で、2日めはもっと高度なスクリプトを書いていたのですが、解析結果の自分向けのレポートが、標準出力だけでは、なんか物足りないのでhtmlファイルで出力しようと、変なところに力を注ぎだしまして。

from bs4 import BeautifulSoup

test1 = BeautifulSoup('','html.parser')
dl_tag = test1.new_tag('dl')
dt_tag = test1.new_tag('dt')
dt_tag.string = 'Title'
dd_tag = test1.new_tag('dd')
dd_tag.string = 'contents'
dl_tag.append(dt_tag)
dl_tag.append(dd_tag)
test1.append(dl_tag)
print(test1)

↓ 出力結果

<dl><dt>Title</dt><dd>contents</dd></dl>

↓ の方が早い

print(<dl><dt>Title</dt><dd>contents</dd></dl>)

(身も蓋もない事を言うな…)

でですね、今回、最初に陥ったのが、stringの追記。
まず、ダメな例。

from bs4 import BeautifulSoup

test2 = BeautifulSoup('','html.parser')
div_tag = test2.new_tag('div',style="margin-left:2em;")
div_tag.string = 'contents1'
div_tag.string = 'contents2'
test2.append(div_tag)
print(test2)

↓ 出力結果

<div style="margin-left:2em;">contents2</div>

追記じゃなくって、上書きされて出てきます。
ところが、下記の方法だと追記できました。

from bs4 import BeautifulSoup

test2 = BeautifulSoup('','html.parser')
div_tag = test2.new_tag('div',style="margin-left:2em;")
div_tag.append('contents1')
div_tag.append('contents2')
test2.append(div_tag)
print(test2)

↓ 出力結果

<div style="margin-left:2em;">contents1contents2</div>

stringなんて要らんかったんや。

でも、これじゃあ出力結果が見づらいから改行を入れたいですよね。
そう思ったら、次の罠にかかりました。

from bs4 import BeautifulSoup

test2 = BeautifulSoup('','html.parser')
div_tag = test2.new_tag('div',style="margin-left:2em;")
div_tag.append('contents1')
div_tag.append('<br>' + 'contents2')
test2.append(div_tag)
print(test2)

↓ 出力結果

<div style="margin-left:2em;">contents1&lt;br&gt;contents2</div>

「<br>」が、エスケープ処理されてタグとして機能しない!!
要らんことしないでいいのに…。

これの正しい対処方法は、

from bs4 import BeautifulSoup

test2 = BeautifulSoup('','html.parser')
div_tag = test2.new_tag('div',style="margin-left:2em;")
div_tag.append('contents1')
div_tag.append(test2.new_tag('br'))
div_tag.append('contents2')
test2.append(div_tag)
print(test2)

↓ 出力結果

<div style="margin-left:2em;">contents1<br/>contents2</div>

ということで、思った以上に手間がかかるので、htmlタグを手打ちしたほうが早いですよね(ぉぃ