Python - サイトマップ - sitemap.xml 作成

クラウディア 
1. 概要
2. sitemap.xml 作成

1. 概要

 実は、前ページでコンテンツを収集して、「.json」ファイルを作成しておけば、「sitemap.xml」を作成するのは、比較的、楽なのです。  前ページの本体を作成したのと同じディレクトリに、今回の本体を作成します。  入力諸元や、他の使用モジュールは、前ページと同じものを使用します。

2. sitemap.xml 作成

 こんなソースを書きました。
import datetime
import json
import os

from Sitemap import Initial
from Sitemap import Common

# @file     makeXML.py
# @version  0.1
# @author   show.kit
# @date     2022年6月16日 新規作成
# @brief    dump した .json ファイルを元に sitemap.xml を作成する

initial  = Initial.Initial()
common   = Common.Common()

common.setstart()
print('開始                   '+common.datetime())

## .json ファイルを読み込んで top を取得しておく

with open(initial.contents, mode='r', encoding='utf-8') as file:
  load = json.load(file)

topkey = next(iter(load))

# 再帰呼び出ししちゃう
# 後でソートするためにいったん URI → 更新日時の辞書型を作成

def sitemap(dic, mydic):

  mydic[dic['uri']] = dic['modified']

  # 辞書内に辞書がある場合は 再帰呼び出しする

  for value in dic.values():
    if (type(value) is dict):
      sitemap(value, mydic)

# 上記のメソッドで辞書を作成

mydic = {}

sitemap(load[topkey], mydic)

# 辞書を元に url loc lastmod の行を作成
# 行を作成してからのソートすると 下記の前後が入れ替わっちゃうのだ
#
#   <url><loc>https://freebsd.sing.ne.jp/</loc><lastmod>
#   <url><loc>https://freebsd.sing.ne.jp/00/</loc>
#

lines = []

for key, value in sorted(mydic.items()):

  line = '<url>'
  line += '<loc>' + key + '</loc>'

  lastmod = datetime.datetime.strptime(value, '%Y%m%d%H%M%S').strftime('%Y-%m-%dT%H:%M:%S+09:00')

  line += '<lastmod>' + lastmod + '</lastmod>'
  line += '</url>' + "\n"
  lines.append(line)

# import pdb; pdb.set_trace()

with open(initial.output, mode='w', encoding='utf-8', newline=os.linesep) as file:
    file.write('<?xml version="1.0" encoding="utf-8"?>' + "\n")
    file.write('<!DOCTYPE urlset>' + "\n")
    file.write('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' + "\n")

    file.writelines(lines)

    file.write('</urlset>' + "\n")

print('終了                   '+common.datetime(), '数', len(lines))
print('処理時間               ', common.getpast())

 最初に使用するモジュールの読込を行うのは、前ページと同様です。  手始めに、作成された「.json」ファイルを読み込みます。  読み込んだ「.json」ファイルには、今回使用するには、余分な情報があるのと、階層構造になっちゃっています。  「sitemap」というメソッドで、階層構造をばらしつつ、単に、「URI=更新日時」という形式の辞書を作成します。  作成した辞書を、「URI」でソートします。  ソートしたものを、下記の形式で、「sitemap.xml」として出力していきます。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlset>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>URI</loc><lastmod>YYYY-MM-DDTHH:MI:SS+09:00</lastmod></url>

...

</urlset>
 固定の文字列の箇所、ハードコーディングしちゃってますが、インクルードするか、イニシャルファイルに書くか、ヒアドキュメントにしたほうがいいでしょうね。
earthcar(アースカー)