使用 PowerShell 将变量中的 non-valid HTML 字符串解析为 DOM

Parse non-valid HTML String in a variable into DOM with PowerShell

背景

我想从 a web site 中获取 HTML 内容,然后将其解析为 HTML 并使用 PowerShell 从已解析的 HTML DOM 中提取一些内容.

Invoke-WebRequest可以从URI中得到HTML,Microsoft.PowerShell.Commands.HtmlWebResponseObject#ParsedHtml()可以将HTML解析为DOM。但是如果响应不包含 charset header,而 HTML 包含 non-ASCII 个字符,ParsedHtml() 将折叠 non-ASCII 个字符。

问题

当你想得到 HTML 正确编码的内容时,你可以像这样将 HtmlWebResponseObject#Content 转换成 HTML 字符串。

$RawContent = Invoke-WebRequest -Method Get -Uri https://kikakurui.com/x0/X0001-1994-01.html
$HtmlString = [System.Text.Encoding]::UTF8.GetString([System.Text.Encoding]::GetEncoding("ISO-8859-1").GetBytes($RawContent.Content))

但是当您尝试从 HTML 字符串中获取 DOM 时,如果 HTML 内容不是有效的 XML,[xml]$HtmlString 将失败。

PS C:\tmp> [xml]$HtmlString
Cannot convert value "<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
(snip)
</body>
" to type "System.Xml.XmlDocument". Error: "'src' is an unexpected token. The expected token is '='. Line 38, position
15."
At line:1 char:1
+ [xml]$HtmlString
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvalidCastToXmlDocument

另一方面,HtmlWebResponseObject#ParsedHtml() 可以解析 HTML,即使内容不是有效的 XML,但无法传递字符串 object ] 进去。

问题

有什么方法可以使用 PowerShell 将变量中的 non-valid HTML 字符串解析为 DOM 吗? PowerShell 的 out-of-the-box 功能更可取。

编辑

PowerShell 的 out-of-the-box 功能更可取,因为我们必须使用受限的 VDI 环境(我们必须请求许可才能安装其他软件)来完成这项工作。

虽然 HTML syntax is based on the XML 语法,但它在很多方面不兼容。因此,(在大多数情况下)您不能使用 XML 解析器来读取它。 相反,您需要使用像 IHTMLDocument2 interface 这样的 HTML 解析器来操纵包含的元素。
例如:

$Uri = 'https://kikakurui.com/x0/X0001-1994-01.html'
$String = [System.Net.Webclient]::New().DownloadString($Uri)
$Unicode = [System.Text.Encoding]::Unicode.GetBytes($String)
$Document = New-Object -Com 'HTMLFile'
if ($Document.IHTMLDocument2_Write) {
    $Document.IHTMLDocument2_Write($Unicode)
} else {
    $Document.write($Unicode)
}
$Document.getElementById('page1-div').getElementsByClassName("ft01")[0].innerText

产量:

本工業規格          JIS