PowerShell7でWebサイトからHTMLファイルをダウンロードしタイトルを取得してみます。
PowerHTMLモジュールを使用します。
PowerHTMLモジュールのインストール
Install-Module -Name PowerHTML
コマンド
$html = Invoke-WebRequest "https://maywork.net" | ConvertFrom-Html
$html.SelectNodes("//title").innerText
結果
迷惑堂本舗
HTMLにTITLEは一つだけだと思われますので、SelectNodeでtitleを指定するとエレメントにたどりつきました。
ちなみに複数の要素がある場合はパイプライン(|)でForeach-Object(%)に繋いであげて、各要素($)にアクセスします。
また、階層的にアクセスする場合は”//html/body/h1″といった感じに表現することが出来ます。
あと、classやid属性を指定する場合は”//div[@class=”aaa”]”や”//div[@id=”aaa”]”といった感じで指定します。
属性の値を取り出す場合は$.Attributes[‘src’].Valueで取り出すことが出来ます。
HTMLのパースは<>を追いかけるだけの様に見えるので、自前で作れそうな気がしますが、実装しようとすると色々な問題が立ちふさがります。筆者の場合様々な文字コードに対応することを考えた段階で心が折れてしまいます(UTF-8で決め打ちできればよいのですが…)。最終的には不完全なHTMLにも対応するレベルまで対応しようと思うと気が遠くなってしまいます。
HTMLのパースは自前でプログラミングするのでなく、誰かがライブラリ化してくれているのであれば、ありがたく使わせてもらう方が良いと思います。
コメント