PowerShellでHTMLから要素の情報をDOMで取得する。

鉄道省の写真帳 コンピュータ
出典:国立国会図書館「NDLイメージバンク」
PowerShellのInvoke-WebRequestコマンドレットでHTMLページを取得したオブジェクトにParsedHTMLというプロパティがあります。こちらのプロパティをDOMでアクセスすることで各要素を取り出すことが出来ます。

class=foo1
class=foo2
id=bar
経済新聞に目を通す情報通 ぱくたその「がちゃ」で引いた画像

HTMLのソース

<div class="foo">class=foo1</div>
<div class="foo">class=foo2</div>
<div id="bar">id=bar</div>
<div class="imglist"><img src="https://maywork.net/wp/wp-content/uploads/2022/05/shinbunGFVL9617_TP_V4-300x200.jpg" alt="経済新聞に目を通す情報通" width="300" height="200" class="size-medium wp-image-8039" /> ぱくたその「がちゃ」で引いた画像</div>

PowerShellスクリプト

$url = "https://maywork.net/computer/powershell-html-dom/"

$o = Invoke-WebRequest -Uri $url

$html = $o.ParsedHTML
# idで絞り込み
$html.getElementById("bar").innerText()
# classで絞り込み
$html.getElementsByClassName("foo") | % { $_.innerText() }
# classで絞り込み後tagで絞り込み
$html.getElementsByClassName("imglist") | % { $_.getElementsByTagName("img") | % { $_.src; $_.alt } }

PowerShellスクリプト実行結果

id=bar
class=foo1
class=foo2
https://maywork.net/wp/wp-content/uploads/2022/05/shinbunGFVL9617_TP_V4-300x200.jpg
経済新聞に目を通す情報通
まず、idをgetElementById()でアクセスしています。
次にclassは複数の要素があることを想定して%(ForEach-Object)で処理しています。
最後にclassで絞り込みを行い、さらにimg要素をgetElementsByTagNameで絞り込み、画像へのリンクアドレスとaltを取得しています。
追記
この記事の内容はWindowsPowerShellで動作確認していますがPowerShell7では動きません。
IEのオブジェクトを使ってHTMLの情報を取得する手段として便利に使っていたのですが、PowerShell7で動かないところを見るとIEのサポート終了に関連しているのかもしれません。
このテーマは一定の需要があるので探せば代わりになる方法は沢山ありそうですので困ることは無さそうですが…
PowerShell7でスクレイピングする方法を模索する。【PowerHTML・HTML Agility Pack】
PowerShell7のInvokeWebRequest()にはParsedHtmlが残念ですが無いので、別の方法を考えてみます。 class=foo1 class=foo2 id=bar ぱくたその「がちゃ」で引いた画像 HTMLのソース...

コメント