(python3)ディレクトリ内の(拡張子も含めて)不定なHTMLファイルについて、中身の特定箇所の文字列を引っ張ってきて全てファイル名変更

パソコンTIPS

こんにちは、ぬーいーです。

コロナの影響で家にいることが多く、本や技術系サイトでインプットしたり、ニュース系サイトを読んだりしています。

そんな中で、読んだテキストをため込めないかと試行錯誤していたのですが、ようやくある程度形になったのでまとめてみました。

やりたいこと:テキストをシンプルなHTMLにしてダウンロード!

要するに、後で読み返したいんですよね。HTMLにする理由はepubに加工してオフラインで読みたいからで、シンプルなHTMLにしたいのは装飾が過剰だと目が痛いから。

ダウンローダーを使っての加工も昔からやっているのですが、ダウンローダーを起動してダウンロードしてテキストエディタで加工……とやっていると、ものすごく面倒くさい。

読んだ文章を取っておきたいので、予めGASなどでスクレイピングをするのは少し違う。
また、URLを開いたら自動でダウンロードが始まるのが望ましい。ダウンロードボタンを押すのは面倒くさい。

と、いう訳で最初はChrome拡張を検討しました。Native File System APIは手動動作が前提のように見えたので今回の目的にそぐわず。

数日考えた末に、「window.URL.createObjectURL(blob)にて作成したURLをwindow.open(url, ‘_blank’)」という形であれば、目的をある一点を除いて達成できそうでした。

image

そう、ファイル名が操作できないことを除けば。

window.URL.createObjectURL(blob)は、ファイル名をつける際にひと手間かかる

通常、window.URL.createObjectURL(blob)を使う場合、URLがランダム文字列になります。

そこで、a要素にdownload属性をつけることによってファイル名を操作するのが通例のようです。

参考:javascriptで生成したファイルをローカルに保存する|Qiita

ただし、私の場合はボタンを押したくありません。よって、ダウンロード時点でファイル名はランダム文字列の拡張子なし。

そこで、ダウンロード後にファイル名を一括で変更するスクリプトを作ることにしました。ただし、ファイル名からは中身が読み取れない。故に、ファイルの中身からファイル名を生成しましょう!

やりたいこと

今回はPython3で作ることにしました。nodeも考えたのですが、手を出したことがなかったのでこれはまたいずれ。

200329_02

仕組みはこんな感じ。今回は右側の話になります。

今回のコード

import glob
import os
# -*- coding: utf-8 -*-
str_start = ‘<meta name=”description” content=”‘
str_end = ‘”><title>’
dirpath=”[ディレクトリ]”
filepath=”
afterFileName=”
metaText=”
files = glob.glob(“[ディレクトリ]*”)def getStringSlice(content,startString,endString):
indexStart = content.find(startString)
if indexStart == -1:
return “”
else:
startlen = len(startString)
indexStart = indexStart + startlen
content1 = content[indexStart:]
indexStart = content1.find(endString)
postText = content1[:indexStart]
return postText

for file in files:
beforeFileName = file
try:
file = open(file, newline=”, encoding=’utf-8′)
data = file.read()
metaText = getStringSlice(data, str_start, str_end)
except Exception as e:
print(e)
finally:
afterFileName = dirpath + metaText + ‘.html’
file.close()
os.rename(beforeFileName,afterFileName)

[ディレクトリ]の中を、見たいローカルフォルダのパスに置き換える感じです。

※Windowsの場合、ディレクトリを書くときは「\」を「/」に置き換えないと上手く動かないことに注意。

なお、該当HTMLのMETA Descriptionのconterntをファイル名として抜き出すように設定していますが、「str_start」と「str_end」の部分を変えれば、h1などを抜き取るように変更できますが、私はダウンロードファイルのMETA Description自体をこのタイトル付けようにChrome拡張で新規生成しているのでこのような処理をしています。

※このへんはお好みで変えてください。

Chrome拡張側のコードさえいじれば、ニュース系の文章サイトからnoteやQiita、あるいは小説系のサイトにも応用が利くはず。

正直自分以外の誰が使うのか全く想定できませんが、勉強も兼ねて公開させていただきます。

コメント