|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - вытянуть информацию из html полученного через curl |
|
PowerShell - вытянуть информацию из html полученного через curl
|
Старожил Сообщения: 211 |
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.
|
|
Отправлено: 08:26, 16-04-2020 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
@echo off SetLocal EnableExtensions set "ps=" & for %%X in (powerShell.exe) do set "ps=%%~$PATH:X" if not defined ps set "ps=%systemRoot%\syswow64\windowsPowerShell\v1.0\powerShell.exe" For /F "UseBackQ delims=" %%a in (`"cmd /c " "%ps%" -ExecutionPolicy ByPass -NoProfile -command "D:\1.ps1" ""`) do ( echo %%a ) pause |
|
Отправлено: 18:31, 20-04-2020 | #71 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Но, имхо, это излишне, если, конечно, эта переменная не подвергалась ручным изменениям... |
|
------- Отправлено: 21:42, 20-04-2020 | #72 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Интересно есть ли ограничение по объему входных данных. Я скормил ему файлик с 700 подсетями, уже скоро как сутки чем то занят, не прерываю вдруг закончит все же.
|
Отправлено: 09:30, 21-04-2020 | #73 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Цитата Griboed0ff:
![]() Можно, конечно, было бы и прогрессбар прикрутить, но это только добавит "тормозов" Чтобы проще было наблюдать, можно организовать вывод каждого IP в отдельный файл... |
||
------- Отправлено: 10:09, 21-04-2020 | #74 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Цитата YuS_2:
![]() YuS_2, помогите пожалуйста собрать теперь этого Франкенштейна |
||
Отправлено: 11:24, 21-04-2020 | #75 |
fascinating rhythm Сообщения: 6626
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
|
|
------- Отправлено: 12:47, 21-04-2020 | #76 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
|
|
Отправлено: 13:23, 21-04-2020 | #77 |
fascinating rhythm Сообщения: 6626
|
Профиль | Отправить PM | Цитировать Про GLPI слышали или вообще про инвентаризационный софт?
|
------- Отправлено: 22:10, 21-04-2020 | #78 |
Crazy Сообщения: 1218
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Вот, скрипт на его основе: script.ps1
param ( #[parameter(Mandatory=$true)] [string]$outfile = 'table_phtml.csv', $encode = 65001, [int[]]$SelectTable = 1 ) #---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------ # Установка дополнительного модуля PowerHTML, для независимого парсинга HTML # Может потребоваться ручное подтверждение установки. if (!(get-module -list powerhtml)) { write-verbose "Installing PowerHTML module for the current user..." install-module powerhtml #-scope currentuser } #----------------------------------------------------------------------------------------- function convert ($from, $to){ begin{ $fenc = [text.encoding]::getencoding($from) $tenc = [text.encoding]::getencoding($to) } process{ $a = $tenc.getbytes($_) $fenc.getstring($a) } } [net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12' [array]$arr = gc 'list_Net.txt' $ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q} $ips|%{ $a = (iwr $_).content $content = if ($a -match [char]208){ $a|convert $encode 28591 } else {$a} $html = [net.webutility]::htmldecode($content)|convertfrom-html [array]$tables = $html.selectnodes('//table') # Исключение вложенных таблиц: $tables = $tables|?{$_.innerhtml -notmatch 'table'} if ([string]::isnullorempty($selecttable)){ $number = 0..($tables.count-1) } else {$number = $selecttable} $tbl = $tables[$number]|%{$n=0}{ $tr = if($_.element('tbody')){ $_.element('tbody').elements('tr') } else {$_.elements('tr')} $headers = @() if($headers = $tr|?{$_.element('th') -ne $null}| %{$_.elements('th')}|select -exp innertext){ $headers=$headers.trim() } else { $headers = 1..( [linq.parallelenumerable]::max( [linq.parallelenumerable]::asparallel(($tr| %{($_.elements('td')|? innertext -ne ''|%{$_}).count})) ) )|%{"H$_"} } $rowind = ,1 * $headers.count $tr|?{$_.elements('td') -ne $null}|%{ $row = $_.elements('td')|? innertext -ne ''|%{ $attr = $_.attributes if ($attr){ $rowspan = ($attr|? name -eq 'rowspan'|select value).value $colspan = ($attr|? name -eq 'colspan'|select value).value } [pscustomobject]@{ 'InnerText' = $_.innertext 'RowSpan' = if($rowspan){[int]$rowspan} else {1} 'ColSpan' = if($colspan){[int]$colspan} else {1} } } $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 } } [pscustomobject]@{ 'IP' = $_ '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 } } |export-csv $outfile -notype -enc utf8 -d ';' Плюсы: Работает гораздо быстрее предыдущих вариантов парсинга через IE Парсер не зависит от наличия IE в системе. Может работать на версиях Powershell Core, где встроенный парсер HTML, связанный с IE, был вырезан, т.е. работает на самых свежих версиях powershell Core... Таблицу разбирает, также с учетом rowspan и colspan Минусы: Зависимость от dom-структуры, всё также, присутствует... Возможно, что-то не учтено (собирал по-быстрому), но проверен на тех страницах, которые здесь были показаны... |
|
------- Отправлено: 23:18, 21-04-2020 | #79 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
|
|
Отправлено: 07:23, 22-04-2020 | #80 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Как получить информацию, не отображаемую в 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 |
|