|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - вытянуть информацию из html полученного через curl |
|
PowerShell - вытянуть информацию из html полученного через curl
|
Старожил Сообщения: 211 |
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.
|
|
Отправлено: 08:26, 16-04-2020 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
|
|
Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33. Отправлено: 10:32, 17-04-2020 | #41 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать добавил сверху то, что рекомендовал DJ Mogarych. Теперь ошибка другая.
|
Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33. Отправлено: 10:37, 17-04-2020 | #42 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Цитата Griboed0ff:
|
||
------- Отправлено: 16:30, 17-04-2020 | #43 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
![]() ну и подкорректировал немного скрипт, плюс вывод в CSV param ( #[parameter(Mandatory=$true)] $encode = 65001, [string]$outfile = 'out.csv', [int]$number = 1 # номер таблицы ) 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' $ips = 130..190 |% {[string]$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_} $ips|%{ $html = new-object -com "HTMLFile" $html.ihtmldocument2_write($(irm $_|convert $encode 28591)) $tables = $html.getelementsbytagname("table") $tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{ $headers = @(); $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]@{ '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 ';' |
|
------- Отправлено: 17:01, 17-04-2020 | #44 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Только дублирует информацию и почему только один вид айпишек. |
|
Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33. Отправлено: 08:42, 18-04-2020 | #45 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
В общем, заменить эту строку: $ips = 130..190 |% {[string]$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_} $ips = 130..190 |% {[string]$((Get-Netipaddress | ? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}| ?{test-connection $_ -count 1 -q} Цитата Griboed0ff:
Чтобы получить все сети, придется писать сканер сети (что нежелательно), либо составить заранее список сетей... Примерно так: - в общем, перечислить все необходимые, а потом: переделать строку в такую: |
||
------- Отправлено: 09:58, 18-04-2020 | #46 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать результат
IP MAC-адрес Номер телефона Серийный номер Номер модели
10.83.3.130 ??? ??? ??? ??? 10.83.3.131 ??? ??? ??? ??? 10.83.3.132 ??? ??? ??? ??? 10.83.3.133 ??? ??? ??? ??? 10.83.3.134 ??? ??? ??? ??? 10.83.3.135 ??? ??? ??? ??? 10.83.3.136 442B031A8F7F 60314 PXN16090HOX CP-6921 10.83.3.137 442B031A8F7F 60314 PXN16090HOX CP-6921 10.83.3.138 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.139 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.140 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.141 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.142 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.143 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.144 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.145 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.146 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.147 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.148 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.149 442B031A7868 60319 PXN16090A7Q CP-6921 10.83.3.150 ??? ??? ??? ??? 10.83.3.151 ??? ??? ??? ??? 10.83.3.152 442B031A8F85 60136 PXN16090HP3 CP-6921 10.83.3.153 442B031A947B 60565 PXN16090FUP CP-6921 10.83.3.154 442B031A947B 60565 PXN16090FUP CP-6921 10.83.3.155 ??? ??? ??? ??? 10.83.3.156 A44C1147B379 60397 PXN161704LE CP-6921 10.83.3.157 A44C1147B379 60397 PXN161704LE CP-6921 10.83.3.158 A44C1147B379 60397 PXN161704LE CP-6921 10.83.3.159 A44C1147B379 60397 PXN161704LE CP-6921 10.83.3.160 A44C1147B379 60397 PXN161704LE CP-6921 10.83.3.161 442B031A9AF3 60504 PXN16090F3D CP-6921 10.83.3.162 442B031A9AF3 60504 PXN16090F3D CP-6921 нет тут другое он записал на каждую найденную айпишку одни и те же данные. Так было уже Цитата DJ Mogarych:
Цитата DJ Mogarych:
По идее решение устроило и работает как надо. Как я понял в вашем парсере проще настроить по таблицам и колонкам. Если доделаем то в теории я смогу потом его переделать под другую ситуацию или это решение поможет кому-то в похожей ситуации. |
||
Последний раз редактировалось Griboed0ff, 18-04-2020 в 10:49. Причина: орфография Отправлено: 10:49, 18-04-2020 | #47 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Вы проверили наличие хостов в сети? В моем коде, реализация иная, т.е. это не то же самое... заполняется теми же данными только из-за отсутствия реальных IP в сети, т.е. цикл заполнения происходит, но IP отсутствует, данные не считываются и строка заполняется предыдущими... Цитата Griboed0ff:
Сделайте так, как я выше написал... т.е., как минимум, строка должна быть такой: $ips = 130..190 |% {[string]$((Get-Netipaddress|? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}|?{test-connection $_ -count 1 -q} Цитата Griboed0ff:
- покажите результат. Цитата Griboed0ff:
Добавлено: Цитата YuS_2:
- выдает не единственный адрес, то правильнее было бы так записать: |
|||||
------- Последний раз редактировалось YuS_2, 18-04-2020 в 12:11. Отправлено: 11:50, 18-04-2020 | #48 |
Старожил Сообщения: 211
|
Профиль | Отправить PM | Цитировать выполнил ваши рекомендации, похоже, что проблема в том, что парсер настроен на один тип страничек, а у двух разных моделей данные находятся в разных таблицах. Результат выполнения вашего скрипта и DJ Mogarych.
|
Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33. Отправлено: 09:15, 19-04-2020 | #49 |
Crazy Сообщения: 1232
|
Профиль | Отправить PM | Цитировать Цитата Griboed0ff:
Здесь, проблема с кодировкой у командлета invoke-restmethod, т.е. это по алгоритму, то же самое, что и invoke-webrequest, и в том, и в другом используется движок IE... что там у него внутри происходит и как именно выбирается кодировка - известно только разрабам. Попробуйте исключить перекодировку в этой строке: Цитата:
Доступные кодировки: использовать можно, как и CodePage, так и Name В крайнем случае, можно с помощью invoke-webrequest скачивать файл, создавать его в виде промежуточного и потом использовать в разборе... так кодировка ломаться не должна. |
||
------- Отправлено: 11:10, 19-04-2020 | #50 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Как получить информацию, не отображаемую в 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 |
|