概要
PowerShellだけでURLにアクセスしてアクセス結果をテキストファイルに保存し、指定文字のある行を抽出して、特定の文字でsplit(区切って)して配列のX番目だけ取り出したい瞬間がありませんか。私はありました。
想像の5倍はめんどうだった…。
コード
# url指定 $url = "https://noarts.net/files/tool/kindle-unlimited-serach.html" # 出力先指定 $outfile = 'C:\aaa\res.txt' # URLにアクセスして$outfileに保存(今回はhtml側にcharsetしてあってUTF-8でとってくれるのでエンコードは指定なし) Invoke-WebRequest $url -OutFile $outfile # uft-8のテキストファイルをutf-8として読み込み(エンコード指定したほうが文字化けしないです) $lines = Get-Content -Encoding UTF8 $outfile # 改行で区切って配列へ(-splitは.splitと違って正規表現が使えるらしい) $lines = $lines -split '(\r\n|\n)' # 一行ずつ処理 foreach ($line in $lines) { # 「"」がある行を抽出(なぜかマルチバイト文字は検索してくれない…) if($line.IndexOf('"') -ne -1) { # 「"」で区切って配列に入れる $item = $line.split('"') # コンソールに0番目の配列を出力 Write-host $item[0] } }
出力結果
上のコードをaaa.ps1というファイル名で保存した場合、Powershellで「powershell -ExecutionPolicy Bypass ./aaa.ps1」とすると実行できます。
今回のファイルを実行すると下記のように出力されます。
元htmlと比較すると「”」のある行だけ抽出されて、splitで分割した「”」の前の部分が切り取れているのがわかると思います。
PS c\> powershell -ExecutionPolicy Bypass ./aaa.ps1 <html lang= <meta charset= <link rel= <div class= <h2 class= <input type= <input type= <div><a href= <script src= <script src= <script async src= <ins class= style= data-ad-client= data-ad-slot= data-ad-format= data-full-width-responsive= <script src= <script src=
おわり。