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

Компьютерный форум 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 | Цитировать


В данный момент ip адрес запроса это результат
Код: Выделить весь код
[array]$arr = $((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
Можно ли сделать чтобы подсети брались из файла?
Например в файле
Код: Выделить весь код
10.80.1.
10.80.26.
10.83.3.
брать первую часто запроса из файла, а вторую как и раньше с 130 по 190 айпишник.

Отправлено: 12:34, 20-04-2020 | #61



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
опробовал на вроде таких же страничках и посыпались ошибки. Странички приложил. »
Странички не при чем. Дело в версии powershell.
Командлет Invoke-WebRequest и Invoke-RestMethod добавлены в powershell v 3.0, а методы парсеров html, возможно и в более поздние версии...
В общем, имеет смысл обновить powershell до актуальной версии...
Да, есть нюанс: если на машине нет Internet Explorer-а, то командлеты эти использовать не получится... они тесно связаны с ним.
Ещё один нюанс: если используется powershell core, т.е. версия новее 5.1, то методы парсинга html через IE, в них уже вырезаны, там придется использовать внешние парсеры типа PowerHTML, в которых уже используется парсинг по типу XML (XPATH и т.п.)... но это уже будет совсем другой скрипт.

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


Отправлено: 12:48, 20-04-2020 | #62


Старожил


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

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


Цитата YuS_2:
В общем, имеет смысл обновить powershell до актуальной версии... »
такой стоит
Код: Выделить весь код
Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      15063  786

Отправлено: 12:53, 20-04-2020 | #63


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
Можно ли сделать чтобы подсети брались из файла? »
Конечно. Именно так, будет лучше... кстати, это предлагал DJ Mogarych...
Код: Выделить весь код
[array]$arr = gc 'list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
Цитата Griboed0ff:
такой стоит »
Значит отсутствует IE... в ошибках указывается на отсутствие методов...

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

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

Отправлено: 12:53, 20-04-2020 | #64


Старожил


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

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


Цитата YuS_2:
Значит отсутствует IE... в ошибках указывается на отсутствие методов... »
IE тоже есть, может запускать не от админа.

Отправлено: 12:59, 20-04-2020 | #65


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
IE тоже есть, может запускать не от админа. »
Хмм, тогда не знаю... надо проверять-тестировать, почему отсутствуют методы...
От админа или от пользователя - без разницы.
Попробую сейчас немного переделать скрипт под другой метод...

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


Отправлено: 13:11, 20-04-2020 | #66


Старожил


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

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


Кстати на моем пк, на других моделях айпишек скрипт отработал корректно!
Тогда непонятно почему на других пк не работает. Пошик не не старый, ie есть.

Отправлено: 13:24, 20-04-2020 | #67


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
Тогда непонятно почему на других пк не работает. »
может net framework не обновлен? без физического доступа, трудно что-либо предполагать...
Вот переделанный скрипт:
script.ps1
Код: Выделить весь код
param (
	#[parameter(Mandatory=$true)]
	$encode = 65001,
	[string]$outfile = 'table.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'
[array]$arr =  gc 'list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
	$html = iwr $_
	$tables = $html.parsedhtml.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){
			if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
			$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
			if($row.innertext -match [char]208){
				for($i=0;$i -lt $row.count;$i++){
					$row[$i].innertext = $row[$i].innertext|convert $encode 28591
				}
			}
			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 ';'


- но тормоз получился изрядный...

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

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

Отправлено: 17:28, 20-04-2020 | #68


Старожил


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

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


Цитата YuS_2:
- но тормоз получился изрядный... »
это вообще не проблема.
Это полное решение. Работает на 4 видах айпишек.

придется из батника запускать так как на компах не включено исполнение ps скриптов. типа команда Set-ExecutionPolicy RemoteSigned и потом запуск скрипта. Есть ли варианты включить эту команду в сам скрипт, чтобы не городить батников?

Отправлено: 18:02, 20-04-2020 | #69


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
Есть ли варианты включить эту команду в сам скрипт, чтобы не городить батников? »
Батником проще, ибо изменение политики запуска скриптов потребует ручного вмешательства.
Батник:
Код: Выделить весь код
powershell -ex bypass .\script.ps1

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


Отправлено: 18:26, 20-04-2020 | #70



Компьютерный форум 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




 
Переход