Private/ConvertFrom-HPWinPEHtml.ps1

function ConvertFrom-HPWinPEHtml {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Html,

        [Parameter(Mandatory)]
        [uri]$BaseUri
    )

    $rows = [regex]::Matches($Html, '(?is)<tr\b[^>]*>(.*?)</tr>')
    $result = foreach ($row in $rows) {
        $cells = @(
            [regex]::Matches($row.Groups[1].Value, '(?is)<t[dh]\b[^>]*>(.*?)</t[dh]>') |
                ForEach-Object {
                    $text = [regex]::Replace($_.Groups[1].Value, '(?is)<[^>]+>', ' ')
                    $text = [System.Net.WebUtility]::HtmlDecode($text)
                    ([regex]::Replace($text, '\s+', ' ')).Trim()
                }
        )

        if ($cells.Count -lt 5 -or $cells[0] -ne 'WinPE 10/11') {
            continue
        }

        $softPaq = ([regex]::Match($cells[2], '(?i)sp\d+')).Value.ToLowerInvariant()
        if (-not $softPaq) {
            continue
        }

        $hrefs = @(
            [regex]::Matches($row.Groups[1].Value, '(?is)href\s*=\s*["'']([^"'']+)["'']') |
                ForEach-Object { [System.Net.WebUtility]::HtmlDecode($_.Groups[1].Value) }
        )

        $downloadHref = $hrefs |
            Where-Object { $_ -match '(?i)sp\d+\.exe(?:\?|$)' } |
            Select-Object -First 1

        if (-not $downloadHref) {
            continue
        }

        $releaseNotesHref = $hrefs |
            Where-Object { $_ -ne $downloadHref } |
            Select-Object -First 1

        $releaseDate = [datetime]::MinValue
        $dateParsed = [datetime]::TryParseExact(
            $cells[3],
            'MM/dd/yyyy',
            [System.Globalization.CultureInfo]::InvariantCulture,
            [System.Globalization.DateTimeStyles]::None,
            [ref]$releaseDate
        )
        if (-not $dateParsed) {
            $releaseDate = $null
        }

        $downloadUri = [uri]::new($BaseUri, $downloadHref)
        $releaseNotesUri = if ($releaseNotesHref) { [uri]::new($BaseUri, $releaseNotesHref) } else { $null }

        $item = [pscustomobject]@{
            PSTypeName      = 'HPWinPEDrivers.DriverPack'
            Manufacturer    = 'HP'
            WinPE           = $cells[0]
            Version         = $cells[1]
            SoftPaq         = $softPaq
            ReleaseDate     = $releaseDate
            Architecture    = 'x64'
            FileName        = "$softPaq.exe"
            DownloadUrl     = $downloadUri.AbsoluteUri
            ReleaseNotesUrl = if ($releaseNotesUri) { $releaseNotesUri.AbsoluteUri } else { $null }
            SourceUrl       = $BaseUri.AbsoluteUri
        }
        $item.PSObject.TypeNames.Insert(0, 'HPWinPEDrivers.DriverPack')
        $item
    }

    @($result | Sort-Object ReleaseDate -Descending)
}