画像を含むWebページを単一のHTMLファイルとして保存することが出来そうなので試してみます。
<#
.SYNOPSIS
要約
.DESCRIPTION
説明
#>
param (
$uriStr = "https://maywork.net/computer/ps-img-download/"
)
function GetBase64Image($uriStr)
{
Write-Host $uriStr
$respose = Invoke-WebRequest $uriStr
$byte = $respose.Content
[Convert]::ToBase64String($byte)
}
$respose = Invoke-WebRequest $uriStr
$html = $respose.ParsedHtml
$title = $html.title
$title = [RegEx]::Replace($title, "[\|\\\/\:\*\?\""\<\>]" , '')
$html.getElementsByTagName("img") | % {
if ($_.src -and ([System.URI]::new($_.src).Scheme) -match "http(s)?") {
$_.src = "data:image/png;base64," + (GetBase64Image $_.src)
}
}
$htmlStr = "<!DOCTYPE html>" + $html.body.parentElement.outerHTML
# JavaScriptを削除
$htmlStr = $htmlStr -replace "<SCRIPT[.\s\S]*?/SCRIPT>", ""
# CSSを削除
$htmlStr = $htmlStr -replace "<STYLE[.\s\S]*?/STYLE>", ""
$enc = [System.Text.UTF8Encoding]::new($false)
Write-Host ".\${title}.html"
[System.IO.File]::WriteAllLines(".\${title}.html", $htmlStr, $enc)
imgエレメントのsrcプロパティにセットされている画像のアドレスから、画像をダウンロードしbase64でエンコードした文字列に置き換えています。
HTMLやMIME、文字コードの処理が雑なスクリプトであれですが、機能的にはスタイルシートの埋め込みがあればEvernoteのウェブクリップをローカルで保存するような代物が作れそうです。
雑な部分を真面目に作るのが大変なので作る予定は無いですが…と思ったら、PC版のGoogle ChromeでCtrl+Sを押し「ウェブページ、完全(.htm;.html)」で実現出来ますので作る必要はなさそうです。
追記20230403
・ファイル名をページのタイトルに変更。
・JavaScriptとCSSを削除
コメント