PowerShell7でスクレイピングする方法を模索する。【PowerHTML・HTML Agility Pack】

powershell7 コンピュータ
powershell7
PowerShell7のInvokeWebRequest()にはParsedHtmlが残念ですが無いので、別の方法を考えてみます。

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>

PowerHTMLモジュールのインストール

Install-Module -Name PowerHTML

PowerShellスクリプト

$url = "https://maywork.net/computer/powershell-html-dom/"
$html = Invoke-WebRequest -Uri $url | ConvertFrom-HTML
# idで絞込
$html.SelectNodes("//div[@id=""bar""]").innerText
# classで絞込
$html.SelectNodes("//div[@class=""foo""]") | % { $_.innerText }
# classで絞込後tagで絞込
$html.SelectNodes("//div[@class=""imglist""]/img") | % {
    $_.Attributes["src"].Value
    $_.Attributes["alt"].Value
}

PowerShellスクリプトの実行結果

id=bar
class=foo1
class=foo2
https://maywork.net/wp/wp-content/uploads/2022/05/shinbunGFVL9617_TP_V4-300x200.jpg
経済新聞に目を通す情報通
PowerShell Galleryでモジュールを探してみたところPowerHTMLというモジュールが良さそうなので試してみました。
PowerHTML 0.1.7
Provides a wrapper for HTML Agility Pack for use where the IE HTML DOM from Invoke-WebRequest is not available such as P...

PowerShell5.1でInvokeWebRequest().ParsedHtmlで取得した結果と同じ値を取り出すことが出来ました。
PowerShellでHTMLから要素の情報をDOMで取得する。
PowerShellのInvoke-WebRequestコマンドレットでHTMLページを取得したオブジェクトにParsedHTMLというプロパティがあります。こちらのプロパティをDOMでアクセスすることで各要素を取り出すことが出来ます。cl...

PowerHTMLはHTML Agility PackというC#のライブラリをPowerShellからアクセスしやすくしたラッパーとのことですが、XPathでHTML要素を指定しています。
XPathは初めて扱いましたが、直感的でわかりやすい記述方法だと思いました。

コメント