|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - вытянуть информацию из html полученного через curl |
|
PowerShell - вытянуть информацию из html полученного через curl
|
Старожил Сообщения: 211 |
Профиль | Отправить PM | Цитировать
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.
|
|
Отправлено: 08:26, 16-04-2020 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
Цитата DJ Mogarych:
|
||
Отправлено: 18:50, 16-04-2020 | #31 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Crazy Сообщения: 1171
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
Чуток изменить его под задачу и вполне сгодится: Script.ps1
param ( #[parameter(Mandatory=$true)] [string]$infile= 'test1.html', [string]$outfile = 'table', [int]$number = 1 #номер таблицы ) [net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12' $uri = "http://10.83.3.156/" $html = iwr $uri $tables = $html.parsedhtml.getelementsbytagname("table") # Исключение таблиц, имеющих вложенные элементы TABLE: $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{$n=0}{ # Обработка всех элементов TABLE, включая со вложенными (вероятна ошибка структуры таблицы). # Необходимо закомментировать строку кода выше и раскомментировать эту: #$tables|%{$n=0}{ $headers = @();$n++ $tr = $_|%{$_.getelementsbytagname("tr")} if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}| %{$_.getelementsbytagname("th")}|select -exp innertext){ $headers = $headers.trim() } else { $headers = 1..([linq.parallelenumerable]::max( [linq.parallelenumerable]::asparallel($tr.lastchild().cellindex) )+1)|%{"H$_"} } $rowind = ,1 * $headers.count $tr.where({$_.firstchild().tagname -eq 'td'})|%{ $row = $_.getelementsbytagname("td") |? innertext -ne $null| select innertext,rowspan,colspan try { $str = [ordered]@{} $k=0 foreach ($item in $row){ if ($rowind[$k] -gt 1){ while ($rowind[$k] -gt 1){ $str[$headers[$k]] = $null $rowind[$k] -= 1 $k++ } } if (($colspan = $item.colspan) -gt 1) { $str[$headers[$k]] = if($item.innertext){ $item.innertext.trim() } else {$null} if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan} $k++ while ($colspan -gt 1){ $str[$headers[$k]] = $null $colspan -=1 if ($rowind[$k] -gt 1){$rowind[$k]-=1} $k++ } } else { $str[$headers[$k]] = if($item.innertext){ $item.innertext.trim() } else {$null} if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan} $k++ } } [pscustomobject]$str } catch { write-host Разметка заголовков не соответствует размерам строк -for red write-host $_ -for cyan } } } [pscustomobject]@{ 'MAC-адрес' = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2 'Номер телефона' = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){ $tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2 } else { $tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2 } 'Серийный номер' = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2 'Номер модели' = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2 } только цикл перебора адресов прикрутить и будет работать... Сегодня уже лень думать... если что, завтра прикручу. |
|
------- Последний раз редактировалось YuS_2, 17-04-2020 в 11:36. Отправлено: 19:00, 16-04-2020 | #32 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Вот всё вместе, пробуйте: add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy $report = @() $ips = 130..190 |% {"$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")" + $_} foreach ($ip in $ips) { if (Test-Connection $ip -Count 1 -Quiet) { $html = (curl "https://$ip/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent if ($html -match "CP-7821") { $html = $html -replace "<.*?>",";" -split ';+ ' -replace "^.*;" $obj = [pscustomobject]@{'IP' = $ip 'MAC-адрес'= $html[-18] 'Номер телефона'= $html[-16] 'Серийный номер'= $html[-11] 'Номер модели'= $html[-10] } } elseif ($html -match "CP-6921") { $html = $html -split '<tr>' -replace "<.*?>" -replace ' ' $obj = [pscustomobject]@{'IP' = $ip 'MAC-адрес'= ($html[-18]).trim() -replace "mac-.*`n\s+" 'Номер телефона'= ($html[-16]).trim() -replace ".*1.*`n.*`n\s+" 'Серийный номер'= ($html[-12]).trim() -replace ".*`n\s+" 'Номер модели'= ($html[-11]).trim() -replace ".*`n\s+" } } } $report += $obj Clear-Variable html,obj } $report |export-csv -Path c:\temp\123.csv -Delimiter ';' -Encoding utf8 -NoTypeInformation |
|
------- Последний раз редактировалось DJ Mogarych, 16-04-2020 в 22:09. Отправлено: 19:36, 16-04-2020 | #33 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать CP-7821 работает нормально, CP-6921 нет
|
Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33. Отправлено: 21:22, 16-04-2020 | #34 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать исправил выше
|
------- Отправлено: 22:10, 16-04-2020 | #35 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
|
|
Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33. Отправлено: 08:18, 17-04-2020 | #36 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
|
|
Отправлено: 08:33, 17-04-2020 | #37 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
В принципе, можно заниматься тем, чем мы тут занимались в этой теме, но это только ради спортивного интереса, в целом это, конечно, костыли. |
|
------- Отправлено: 08:45, 17-04-2020 | #38 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
|
|
Отправлено: 08:55, 17-04-2020 | #39 |
Crazy Сообщения: 1171
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Если структура требуемых страниц отличается, то естественно, придется скрипт корректировать... т.е. так, чтобы была полная универсальность, в костылях сделать не получится... Цитата Griboed0ff:
- это формирование хэш-таблицы, в которой дергаются данные из того, что было выбрано парсером. Т.к. исходный парсер использует все таблицы, то в конечном пришлось добавить параметр номера таблицы (нумерация начинается с 0), в которой находятся необходимые данные. Этот номер сильно зависит от структуры страницы и автоматом его определять сложно, необходима привязка к конечным данным. Цитата Griboed0ff:
|
|||
------- Отправлено: 09:44, 17-04-2020 | #40 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Как получить информацию, не отображаемую в HTML-коде? | Apock | Вебмастеру | 0 | 26-12-2015 22:11 | |
Имитация браузера через cURL | dmit.medv | Вебмастеру | 0 | 28-12-2012 18:02 | |
[решено] Вывести информацию из файла через JS | MultiMax | Вебмастеру | 1 | 31-05-2011 22:58 | |
[решено] Вытянуть содержание HTML тега с помощью регулярных выражений | aesir | AutoIt | 4 | 28-08-2009 21:22 | |
Как передать в javascript данные массива, полученного из кода на php | vagner_HATE | Вебмастеру | 1 | 18-06-2009 13:51 |
|