Парсинг таблицы #Powershell
Необходимо вытянуть таблицу из html - разметки. Для примера взяли начальную страницу (весь сайт сверстан в табличной форме). Пытаюсь получить с помощью PowerShell и Selenium\WebDriver.dll. Как получить необходимый тэг, проблем не составило, но вот как все остальное реализовать???? Получить необходимо результат в табличной форме. Код страницы из которой получить таблицу`
<div class="loginContainer">
<table cellspacing="0" cellpadding="0" border="0">
<tr>
<td class="loginLogo"><img alt="HP" src="/sm/cwc/images/backgrounds/logo_hp_largemasthead.gif"></td>
<td class="loginTitle">Таблица 1</td>
<td class="loginImage"><div class="imgSpacer"> </div></td>
</tr>
</table>
</div>
<div class="loginForm">
<form id="Login" name="Login" autocomplete="on" onSubmit="setCwcToken()" style="margin-top:4px;" method="POST" action="/sm/index.do">
<table id="cwc_custom_loginform" cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td class="loginLabel"> </td>
<td class="loginInput">
<div id="WarningMsgWrapperDiv" style='visibility:hidden; background:transparent url(/sm/cwc/images/msg_warning.gif) no-repeat; margin-top:10px; padding-left:20px; line-height:16px;'>
</div>
</td>
</tr>
<tr>
<td class="loginLabel">
<label for="LoginUsername" id="LoginUsernameLabel" class="loginLabel">Имя пользователя:</label>
</td>
<td class="loginInput">
<input id="LoginUsername" type="text" name="user.id" tabindex="1">
</td>
</tr>
<tr>
<td class="loginLabel">
<label for="LoginPassword" id="LoginPasswordLabel" class="loginLabel">Пароль:</label>
</td>
<td class="loginInput">
<input id="LoginPassword" type="password" tabindex="2">
</td>
</tr>
<tr>
<td class="loginLabel">
<label for="LoginLanguage" id="Locale" class="loginLabel">Язык:</label>
</td>
<td class="loginInput">
<select name="L.language" id="LoginLanguage" tabindex="3">
<option value="ru" selected = "true">Русский</option>
</select>
</td>
</tr>
<tr>
<td class="loginLabel"> </td>
<td class="loginInput">
<table cellspacing="0" cellpadding="0" border="0" class="x-btn-wrap x-btn" id="clrBtn"
onmouseup="removeClass(this, ' x-btn-click');"
onmousedown="addClass(this, ' x-btn-click');"
onmouseout="removeClass(this, ' x-btn-over');"
onmouseover="removeClass(this, ' x-btn-click');addClass(this, ' x-btn-over');">
<tbody>
<tr>
<td class="x-btn-left cwc-btn-left"><i> </i></td>
<td class="x-btn-center cwc-btn-center">
<em unselectable="on">
<input type="submit"
id="loginBtn" class="x-btn-text cwc-btn-text"
onblur="removeClass('clrBtn', ' x-btn-over');"
onfocus="addClass('clrBtn', ' x-btn-over');"
value=" Вход в систему ">
</em>
</td>
<td class="x-btn-right cwc-btn-right"><i> </i></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td class="loginLabel"> </td>
<td class="loginInput"> </td>
</tr>
<tr>
<td>
<div id="licensingLogos" class="loginLogos">
</div>
</td>
<td class="loginCopyright">
<div id="cwc_copyright">
© 1994-2014 Компания.<br/> Данное программное <br /><br /><br /><br /><br />
</div>
</td>
</tr>
</table>
<input type="hidden" name="type" id="type" value="login">
<input type="hidden" id="xHtoken" name="xHtoken"/>
<input type="hidden" id="old.password" name="old.password"/>
<input type="hidden" name="event" id="event" value="0"/>
</form>
</div>
Начало скрипта PowerShell
Add-Type -Path "c:\Selenium\WebDriver.dll"
$env:PATH += ";c:\Selenium"
$browser = New-Object "OpenQA.Selenium.Chrome.ChromeDriver"
$browser.Navigate().GoToURL("http://....")
$tables = $browser.FindElements($selBy::TagName('table'))
$rows = $tables.FindElements($selBy::TagName('td'))
$resultObject = [Ordered] @{ }
for ($counter = 0; $counter -lt $rows.Count; $counter++)
{ .... Цикл не могу реализовать корректно }
[PSCustomObject]$resultObject
Ответы (1 шт):
Автор решения: filimonic
→ Ссылка
Берешь HTMLAgilityPack
Для примера использую таблицу отсюда.
[void][System.Reflection.Assembly]::LoadFile("C:\...\lib\netstandard2.0\HtmlAgilityPack.dll")
$doc = [HtmlAgilityPack.HtmlDocument]::new()
$doc.Load('s:\SCRIPTS\htmlAP.html')
$table = $doc.DocumentNode.SelectNodes('//table')[0] # Первая таблица в докементе
$headers = @( $table.SelectNodes('/table/tr/th') | ForEach-Object { return $_.InnerText.Trim() } )
$rows = $table.SelectNodes('./tr[./td]')
$retObjects = [System.Collections.Generic.List[PSCustomObject]]::new()
for($i = 0; $i -lt $rows.Count; $i++)
{
$values = $null
$row = $rows[$i]
$values = @( $row.SelectNodes('./td') | ForEach-Object { return $_.InnerText.Trim() } )
if ($values.Count -ne $headers.Count)
{
Write-Warning "Тут неправильные пчёлы"
continue
}
$retObjectHT = @{}
for ($j = 0; $j -lt $headers.Count; $j++)
{
$retObjectHT[$headers[$j]] = $values[$j]
}
$retObjects.Add([PSCustomObject]$retObjectHT)
}
$retObjects | Out-GridView