Pythonのモジュールを使ってWordファイルからHTMLファイルを作成する方法

RPAエンジニア 大庭

この記事はミツエーリンクス Advent Calendar 2020 - Adventarの12日目の記事です。

今回は、Pythonのモジュールであるmammothbeautifulsoup4を使ってWordファイルからHTMLファイルを作成する方法をご紹介します。

この方法を採用する理由として、mammothを使ってあらかじめ指定したHTML形式でWordファイル内の文章をマークアップできることが挙げられます。それによって、既に構築されているWebサイトのコラム記事などを追加する際に、Wordファイルで原稿を書いてそのHTMLファイルを作成するというやり方が実現でき、さらにHTMLファイル作成までの時間を短縮することができます。

環境は、Windows 10にMicrosoft WordとPython 3.9がインストールされていて、pip(Python向けのパッケージ管理システム)からmammothモジュール、beautifulsoup4モジュールがインストールされているものとします。

また、html要素のパーツ(モジュール)の個別処理にはUiPathを使用します。UiPathはRPA(ロボティック・プロセス・オートメーション)の製品の1つで、「要素をクリックする」「文字を入力する」などのさまざまなアクティビティを組み合わせてワークフローを作り、処理を自動化することができます。UiPathを使うことにより、mammothでは対応しきれないモジュールごとの構成に対応させることができます。例えば、mammothでは出力するhtml要素に指定できるclassは1つのみですが、UiPathを使うことで複数のclassを加えることができます。また、後述するPythonを使った処理もUiPathのアクティビティを使用することで自動化できます。

全体の流れは、

  1. Wordファイルのスタイルを設定する
  2. mammothのカスタムスタイルマップ機能を使用するためのテキストファイルを作成する
  3. mammothでHTMLファイルを出力する
  4. beautifulsoup4でhtml要素のパーツ(モジュール)に分割して出力する
  5. UiPathでモジュールごとに個別処理をしてHTMLファイルを作成する

となります。

1. Wordファイルのスタイルを設定する

mammothの機能の中にカスタムスタイルマップというものがあります。この機能を利用すると、Wordファイルで段落に指定したスタイルごとに出力されるhtml要素とクラス名を指定できます。そのためにあらかじめWordファイルで新しくスタイルを作成し、html要素ごとにそれぞれの段落にスタイルを適用します。

例として、Wordファイルのスタイルにmidashi1という新しいスタイルを作成します。注意点として、mammothで読み込めるWordファイルのスタイル名は英数字に限られるようです。

Wordファイルのスタイルにmidashi1を追加する

2. mammothのカスタムスタイルマップ機能を使用するためのテキストファイルを作成する

1.で作成したスタイルに対応するカスタムスタイルマップを記述したテキストファイルを用意します。

midashi1のスタイルを適用した段落を、h1要素でクラス名がtitle-01というhtml要素に出力したい場合は以下のように記述します。

p[style-name='midashi1'] => h1.title-01:fresh

wrapperというクラス名のdiv要素で囲って出力したい場合は以下のようにします。

p[style-name='midashi1'] => div.wrapper > h1.title-01:fresh

このようにWordファイルに新しく作成したスタイルごとに1行ずつカスタムスタイルマップのルールを書き、custom-style-map.txtというテキストファイルとして保存します。

3. mammothでHTMLファイルを出力する

下記のようにPythonでコマンドを実行し、1.でスタイルを適用したdocument.docxからcustom-style-map.txtに記述したルールに基づいて変換されたtemp.htmlを出力します。

mammoth document.docx temp.html --style-map="custom-style-map.txt"

4. beautifulsoup4でhtml要素のパーツ(モジュール)に分割して出力する

下記のようにPythonでコマンドを実行してtemp.htmlの中の最上位の要素(モジュール)で分割し、上から順に01.html、02.html...という名前でhtmlフォルダーに保存します。

soup = bs4.BeautifulSoup(open("temp.html", encoding="utf-8"), "html.parser")
elements = soup.find_all(recursive=False)

i = 1
for element in elements:
    path_w = ".\\html\\" + format(str(i), "0>2") + ".html"
    s = str(element)
    with open(path_w, mode="w", encoding="utf-8") as f:
        f.write(s)

5. UiPathでモジュールごとに個別処理をしてHTMLファイルを作成する

4.でhtmlフォルダーに作成したモジュールごとのHTMLファイルをUiPathを使って処理をします。

まず、代入(System.Activities.Statements.Assign)アクティビティでDirectory.GetFilesメソッドを使ってhtmlフォルダー内のすべてのHTMLファイルのパスを配列に格納します。

次に、繰り返し(コレクションの各要素)(UiPath.Core.Activities.ForEach)アクティビティでファイルパスを格納した配列を指定し、そのスコープ内でテキストをファイルから読み込み(UiPath.Core.Activities.ReadTextFile)アクティビティでHTMLファイルを1つずつ読み込みます。読み込んだHTMLテキストに対して置換(UiPath.Core.Activities.Replace)アクティビティなどを使って出力したいモジュールの形式に修正します。修正したHTMLテキストを代入アクティビティで上から順に連結していきます。

最後に、各モジュールを連結したHTMLテキストをテキストをファイルに書き込み(UiPath.Core.Activities.WriteTextFile)アクティビティで最終的な形のHTMLファイルに出力します。

UiPathの全体フローチャート

Wordファイルで原稿を書き、それをもとにHTMLファイルを作成したいときには今回ご紹介した方法が便利ですのでぜひ実践してみてください。