Как разобрать HTML таблицу с Powershell Core 7? - PullRequest
2 голосов
/ 12 марта 2020

У меня есть следующий код:

    $html = New-Object -ComObject "HTMLFile"
    $source = Get-Content -Path $FilePath -Raw
    try
    {
        $html.IHTMLDocument2_write($source) 2> $null
    }
    catch
    {
        $encoded = [Text.Encoding]::Unicode.GetBytes($source)
        $html.write($encoded)
    }
    $t = $html.getElementsByTagName("table") | Where-Object {
        $cells = $_.tBodies[0].rows[0].cells
        $cells[0].innerText -eq "Name" -and
        $cells[1].innerText -eq "Description" -and
        $cells[2].innerText -eq "Default Value" -and
        $cells[3].innerText -eq "Release"
    }

Код отлично работает на Windows Powershell 5.1, но на Powershell Core 7 $_.tBodies[0].rows возвращает ноль.

Итак, как получить доступ к строкам таблицы HTML в PS 7?

1 Ответ

0 голосов
/ 12 марта 2020

PowerShell [Core], начиная с 7.0, не поставляется со встроенным HTML синтаксическим анализатором .

Вы должны положиться на стороннее решение , такой как PowerHTML модуль , который обертывает HTML Agility Pack .

объектная модель работает не так, как Inte rnet Explorer-based, доступная в Windows PowerShell; похоже на XML DOM, предусмотренное стандартом System.Xml.XmlDocument тип [1] ; см. документацию и пример кода ниже.

# Install the module on demand
If (-not (Get-Module -ErrorAction Ignore -ListAvailable PowerHTML)) {
  Write-Verbose "Installing PowerHTML module for the current user..."
  Install-Module PowerHTML -ErrorAction Stop
}
Import-Module -ErrorAction Stop PowerHTML

# Create a sample HTML file with a table with 2 columns.
Get-Item $HOME | Select-Object Name, Mode | ConvertTo-Html > sample.html

# Parse the HTML file into an HTML DOM.
$htmlDom = ConvertFrom-Html -Path sample.html

# Find a specific table by its column names, using an XPath
# query to iterate over all tables.
$table = $htmlDom.SelectNodes('//table') | Where-Object {
  $headerRow = $_.Element('tr') # or $tbl.Elements('tr')[0]
  # Filter by column names
  $headerRow.ChildNodes[0].InnerText -eq 'Name' -and 
    $headerRow.ChildNodes[1].InnerText -eq 'Mode'
}

# Print the table's HTML text.
$table.InnerHtml

# Extract the first data row's first column value.
# Note: @(...) is required around .Elements() for indexing to work.
@($table.Elements('tr'))[1].ChildNodes[0].InnerText

[1] В частности, относительно поддержки запросов XPath с помощью методов .SelectSingleNode() и .SelectNodes() предоставление дочерних узлов с помощью коллекции .ChildNodes и предоставление свойств .InnerHtml / .OuterHtml / .InnerText. Вместо indexer , который поддерживает имена дочерних элементов, предоставляются методы .Element(<name>) и .Elements(<name>).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...