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

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


Скрытый текст
Код: Выделить весь код
PS C:\WINDOWS\system32> get-module powerhtml

ModuleType Version    Name                                ExportedCommands                                                                                                                                           
---------- -------    ----                                ----------------                                                                                                                                           
Script     0.1.7      powerhtml                           ConvertFrom-Html                                                                                                                                           
Script     0.1.7      PowerHTML                           ConvertFrom-Html                                                                                                                                           



PS C:\WINDOWS\system32> get-instaledmodule powerhtml
get-instaledmodule : Имя "get-instaledmodule" не распознано как имя командлета, функции, файла сценария или выполняемой программы. Проверьте правильность написания имени, а также наличие и правильность пути, после
 чего повторите попытку.
строка:1 знак:1
+ get-instaledmodule powerhtml
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (get-instaledmodule:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
 

PS C:\WINDOWS\system32> get-installedmodule powerhtml
ПРЕДУПРЕЖДЕНИЕ: Не удалось скачать список доступных поставщиков. Проверьте подключение к Интернету.

Version    Name                                Type       Repository           Description                                                                                                                           
-------    ----                                ----       ----------           -----------                                                                                                                           
0.1.7      PowerHTML                           Module     https://www.power... Provides a wrapper for HTML Agility Pack for use where the IE HTML DOM from Invoke-WebRequest is not available such as Powershell Core


Скрытый текст
Код: Выделить весь код
new-object : Не удается найти тип [HtmlAgilityPack.HtmlDocument]: убедитесь в том, что сборка, содержащая этот тип, загружена.
C:\Program Files\WindowsPowerShell\Modules\powerhtml\0.1.7\Public\ConvertFrom-HTML.ps1:55 знак:24
+             $htmlDoc = new-object HtmlAgilityPack.HtmlDocument
+                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
 
Невозможно вызвать метод для выражения со значением NULL.
C:\Program Files\WindowsPowerShell\Modules\powerhtml\0.1.7\Public\ConvertFrom-HTML.ps1:60 знак:21
+                     $htmlDoc.LoadHtml($inputItem)
+                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Невозможно вызвать метод для выражения со значением NULL.
D:\PowerShell\phone_powerhtml.ps1:38 знак:2
+     [array]$tables = $html.selectnodes('//table')
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Не удается индексировать в массив NULL.
D:\PowerShell\phone_powerhtml.ps1:46 знак:2
+     $tbl = $tables[$number]|%{$n=0}{
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray
 
Исключение при вызове "IndexOf" с "2" аргументами: "Значение не может быть неопределенным.
Имя параметра: array"
D:\PowerShell\phone_powerhtml.ps1:109 знак:2
+     [pscustomobject]@{
+     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentNullException
еще ise всегда спрашивает разрешения на запуск скриптов, я так понимаю это политикой домена или у винды по умолчанию так. Щас попробую на другой доменной тачке.

Последний раз редактировалось Griboed0ff, 22-04-2020 в 13:31.


Отправлено: 13:25, 22-04-2020 | #91



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
Установил на пк где есть инет »
Там работает скрипт?

Цитата Griboed0ff:
скопировал папку с модулем и положил по тому же пути на пк где инет ограничен. »
Странно, должен работать. Попробуйте в консоли выполнить:
Код: Выделить весь код
find-module powerhtml -rep "PSGallery"|save-module -path 'D:\localMODULE'
и из этого каталога взять модуль и скопировать на другой компьютер...
Ну, можно ещё попробовать в скрипт добавить строку:
Код: Выделить весь код
import-module powerhtml
Цитата Griboed0ff:
еще ise всегда спрашивает разрешения на запуск скриптов, я так понимаю это политикой домена или у винды по умолчанию так. »
а в консоли выполняются?
По умолчанию, политика запуска скриптов запрещает не подписанные.
Цитата:
Для выполнения неподписанных скриптов, созданных на локальном
компьютере, и подписанных скриптов других пользователей, нужно
использовать следующую команду для изменения политики исполнения на
RemoteSigned:

Код: Выделить весь код
set-executionpolicy remotesigned
Дополнительные сведения см. в описании командлета Set-ExecutionPolicy.

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

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

Отправлено: 14:32, 22-04-2020 | #92


Старожил


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

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


Цитата YuS_2:
По умолчанию, политика запуска скриптов запрещает не подписанные. »
Это политика доменная оказалась, попробовал на другом пк powerhtml. Работает, задал ему сеть где один айпишки 2-254, нашел все, правда парочку не смог считать, но одна страничка оказалась на английском поэтому и не считалась, а вторая видимо имеет другую структуру. Так же заметил в мониторинге сети, что скрипт ничего не вроде как никуда первые минут 5-7 не посылает, а потом за пару минут скачивают всю инфу.
Цитата YuS_2:
Бороться с этим можно так: »
это постигло и скрипт poewrhtml, если нет айпишек в сети то пишет ерунду с прошлого запуска.

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


Отправлено: 14:58, 22-04-2020 | #93


Старожил


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

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


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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
скрипт ничего не вроде как никуда первые минут 5-7 не посылает, а потом за пару минут скачивают всю инфу. »
там он сначала пингует хосты, с одновременным формированием доступных IP

Цитата Griboed0ff:
это постигло и скрипт poewrhtml, если нет айпишек в сети то пишет ерунду с прошлого запуска. »
Да, там то же самое надо сделать, сейчас добавлю...

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


Отправлено: 18:05, 22-04-2020 | #95


Старожил


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

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


Цитата YuS_2:
сейчас добавлю »
а можете указать где меняете? я ваши решения тусую, один скрипт который через powerhtml будет запускаться с моего компа и собирать инфу с многих компов, а скрипт который был до этого, будет запускаться планировщиком и записывать данные в файл.

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Griboed0ff:
правда парочку не смог считать, но одна страничка оказалась на английском поэтому и не считалась »
Руки бы поотшибать этим "сиськопрограммерам" html...
Мало того, что впихнули внутрь ячеек тег <b>...</b>, так ещё и кодировку умудрились использовать windows-1251...
В общем, так как-то:
script_phtml.ps1
Код: Выделить весь код
param (
	#[parameter(Mandatory=$true)]
	[string]$outfile = 'table_phtml.csv',
	$enc1 = 65001,
	$enc2 = 28591,
	[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 'D:\PowerShell\list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}

$ips|%{
	if (test-connection $_ -count 1 -q){
		try {
			$a = (iwr $_).content
			#$a = gc $_ -raw -enc utf8
			$content = if ($a -match [char]208){
				if ($a -match 'windows-1251'){$enc1,$enc2 = 1251,1252}
				$a|convert $enc1 $enc2
			} 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 ''}|%{
					$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-адрес' 		= if ([array]::indexof($tbl.h1,'MAC-адрес') -ne -1){
										$tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
									  } else {$tbl[([array]::indexof($tbl.h1,'MAC Address'))].h2}
				'Номер телефона'	= if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
										$tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
									  } elseif ([array]::indexof($tbl.h1,'Номер телефона 1') -ne -1){
									  	$tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
									  } else {
									  	$tbl[([array]::indexof($tbl.h1,'Phone DN'))].h2
									  }
				'Серийный номер'	= if ([array]::indexof($tbl.h1,'Серийный номер') -ne -1){
										$tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
									  } else {$tbl[([array]::indexof($tbl.h1,'Serial Number'))].h2}
				'Номер модели'		= if ([array]::indexof($tbl.h1,'Номер модели') -ne -1){
										$tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
									  } else {$tbl[([array]::indexof($tbl.h1,'Model Number'))].h2}
			}
		} catch {
			write-host Ошибка: $_ -for red
		}
	}
}  |export-csv D:\PowerShell\all_phone.csv -notype -enc utf8 -d ';' -append

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


Последний раз редактировалось YuS_2, 23-04-2020 в 06:25. Причина: исправление

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

Отправлено: 19:38, 22-04-2020 | #97


Старожил


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

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


Цитата YuS_2:
В общем, так как-то: »
Идеально!!! Сейчас кажется даже если и появится какая-нибудь модель айпишки, то мне кажется в скрипте уже все варианты перечислены. Спасибо огромное!

Отправлено: 08:02, 23-04-2020 | #98


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Цитата YuS_2:
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
if (test-connection $_ -count 1 -q){ »
проверка соединения 2 раза

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

Отправлено: 08:57, 23-04-2020 | #99


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
проверка соединения 2 раза »
Цитата YuS_2:
-есть проверка существования хостов и если они не отвечают, то в массив не должны попадать...
Хотя, конечно, есть вероятность того, что пока пингуется весь список по порядку, какой-либо хост отключается и соответственно, происходит именно то, что Вы описываете. »

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


Отправлено: 12:09, 23-04-2020 | #100



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




 
Переход