Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - вытянуть информацию из html полученного через curl

Ответить
Настройки темы
PowerShell - вытянуть информацию из html полученного через curl

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Изменения
Автор: Griboed0ff
Дата: 17-09-2021
Доброго всем времени суток. Есть задача, которую надо решить именно через bat. Через curl скачивается страничка и из нее нужно извлечь нужную информацию, на скрине отмечено, что нужно вытянуть мак-адрес, номер телефона, модель и серийный номер. На данный момент батник уже может: узнает какая подсеть на компе, потом сканит диапазон из этой подсети, потом curl скачивает странички с айпишки с данными. А вот далее нужно, чтобы батник мог как-то вытянуть данные со странички и плюс как-то мог сам подставить все странички, которые есть в папке.

Отправлено: 08:26, 16-04-2020

 

Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
[pscustomobject]@{ »
попробовал ваш код, имеется ошибка. А по настройке примерно понятно, посидеть поиграться на другой страничке для понимания.

Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33.


Отправлено: 10:32, 17-04-2020 | #41



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


добавил сверху то, что рекомендовал DJ Mogarych. Теперь ошибка другая.

Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33.


Отправлено: 10:37, 17-04-2020 | #42


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
попробовал ваш код, имеется ошибка. »
Да, там была ошибка в наименовании переменной...
Цитата Griboed0ff:
добавил сверху то, что рекомендовал DJ Mogarych. Теперь ошибка другая. »
Добавлю, чуть позже... там ещё, видимо, код придется переделать, чтобы не из файла получать данные, а скачивать его... в invoke-webrequest от рождения присутствует баг с кодировками, а т.к. тут присутствует кириллица, то код тот будет неправильно работать.

-------
scio me nihil scire. Ѫ


Отправлено: 16:30, 17-04-2020 | #43


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
чуть позже... »
вот, прикрутил перебор адресов, стыренный у DJ Mogarych
ну и подкорректировал немного скрипт, плюс вывод в 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 ';'
- здесь подразумевается номер таблицы 1 и таблица с данными должна быть из двух колонок (если будет больше, то скрипт придется корректировать)

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:01, 17-04-2020 | #44


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
вот, прикрутил перебор адресов, стыренный у DJ Mogarych
ну и подкорректировал немного скрипт, плюс вывод в CSV »
Вот это монстрище получилось!
Только дублирует информацию и почему только один вид айпишек.

Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33.


Отправлено: 08:42, 18-04-2020 | #45


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить 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:
и почему только один вид айпишек. »
Один - потому, что Get-Netipaddress... тут будут только IP из интерфейсов текущего компьютера.
Чтобы получить все сети, придется писать сканер сети (что нежелательно), либо составить заранее список сетей...
Примерно так:
Код: Выделить весь код
$net = '10.83.3.', '10.80.5.', '10.82.0.'
- в общем, перечислить все необходимые, а потом:
переделать строку в такую:
Код: Выделить весь код
$ips = $net|%{$ip = $_;130..190|%{$ip + $_}}|?{test-connection $_ -count 1 -q}

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:58, 18-04-2020 | #46


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить 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
fascinating rhythm
Moderator
Сообщения: 5044
Благодарности: 900
Конфигурация
Профиль | Сайт | Отправить PM | Цитировать | Сообщить модератору
Вставьте после $report += $obj
Код: Выделить весь код
C »
Цитата DJ Mogarych:
Вставьте после $report += $obj
Код: Выделить весь код
Clear-Variable html,obj »
Айпишки разных видов есть в этой подсети точно и в другую подсеть не надо лазить.

По идее решение устроило и работает как надо. Как я понял в вашем парсере проще настроить по таблицам и колонкам. Если доделаем то в теории я смогу потом его переделать под другую ситуацию или это решение поможет кому-то в похожей ситуации.

Последний раз редактировалось Griboed0ff, 18-04-2020 в 10:49. Причина: орфография


Отправлено: 10:49, 18-04-2020 | #47


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
нет тут другое он записал на каждую найденную айпишку одни и те же данные. Так было уже»
Что значит другое?
Вы проверили наличие хостов в сети?
В моем коде, реализация иная, т.е. это не то же самое... заполняется теми же данными только из-за отсутствия реальных IP в сети, т.е. цикл заполнения происходит, но IP отсутствует, данные не считываются и строка заполняется предыдущими...

Цитата Griboed0ff:
на каждую найденную айпишку одни и те же данные.»
Здесь, IP не найдены, а сформированы в массив из другого массива 130..190
Сделайте так, как я выше написал... т.е., как минимум, строка должна быть такой:
Код: Выделить весь код
$ips = 130..190 |% {[string]$((Get-Netipaddress|? ipaddress -match "^10\.").ipaddress -replace "\d+$") + $_}|?{test-connection $_ -count 1 -q}
Цитата Griboed0ff:
Айпишки разных видов есть в этой подсети точно и в другую подсеть не надо лазить. »
Посмотрите, что есть у Вас здесь:
Код: Выделить весь код
(Get-Netipaddress |? ipaddress -match "^10\.").ipaddress
- покажите результат.

Цитата Griboed0ff:
Как я понял в вашем парсере проще настроить по таблицам и колонкам. »
Немного проще, но прямая зависимость от dom-структуры, в частности элементов TABLE, всё же, есть...

Добавлено:
Цитата YuS_2:
Сделайте так, как я выше написал... т.е., как минимум, строка должна быть такой: »
А вообще, по логике, если эта строка:
Код: Выделить весь код
(Get-Netipaddress |? ipaddress -match "^10\.").ipaddress
- выдает не единственный адрес, то правильнее было бы так записать:
Код: Выделить весь код
[array]$arr = $((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 18-04-2020 в 12:11.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:50, 18-04-2020 | #48


Старожил


Сообщения: 211
Благодарности: 2

Профиль | Отправить PM | Цитировать


выполнил ваши рекомендации, похоже, что проблема в том, что парсер настроен на один тип страничек, а у двух разных моделей данные находятся в разных таблицах. Результат выполнения вашего скрипта и DJ Mogarych.

Последний раз редактировалось Griboed0ff, 17-09-2021 в 15:33.


Отправлено: 09:15, 19-04-2020 | #49


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата Griboed0ff:
похоже, что проблема в том, что парсер настроен на один тип страничек, а у двух разных моделей данные находятся в разных таблицах. »
Нет, таблицы он определяет правильно... по крайней мере в тех двух файлах, что Вы приводили выше...
Здесь, проблема с кодировкой у командлета invoke-restmethod, т.е. это по алгоритму, то же самое, что и invoke-webrequest, и в том, и в другом используется движок IE... что там у него внутри происходит и как именно выбирается кодировка - известно только разрабам.
Попробуйте исключить перекодировку в этой строке:
Цитата:
$html.ihtmldocument2_write($(irm $_|convert $encode 28591))
или использовать другие типы в параметре $encode
Доступные кодировки:
Код: Выделить весь код
[text.encoding]::getencodings()
использовать можно, как и CodePage, так и Name
В крайнем случае, можно с помощью invoke-webrequest скачивать файл, создавать его в виде промежуточного и потом использовать в разборе... так кодировка ломаться не должна.

-------
scio me nihil scire. Ѫ


Отправлено: 11:10, 19-04-2020 | #50



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - вытянуть информацию из html полученного через curl

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как получить информацию, не отображаемую в 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




 
Переход