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

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


Цитата DJ Mogarych:
А как это батником вы собирались реализовывать, вообще уму непостижимо. »
скорее всего костылями, оставил бы для начала только строку с нужными данными, потом начал бы удалять данные от html типа тегов, потом бы пробовал бы посимвольно копировать нужное. Так сложно получилось, потому что пришлось получается весь батник переписать для ps. осталось немного, понять как настроить парсер.

Цитата DJ Mogarych:
Надо эти HTML-файлы парсить по-разному, там даже в одной и той же таблицы тэги отсортированы по-разному »
то есть получается парсер настраивается даже не в цифрах на конце строк?

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



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата DJ Mogarych:
Я что-то утомился уже, не ожидал, что придётся тут целый проект мутить на коленке. »
Кстати, тут может пригодиться тот парсер таблиц
Чуток изменить его под задачу и вполне сгодится:
Script.ps1
Код: Выделить весь код
param (
	#[parameter(Mandatory=$true)]
	[string]$infile= 'test1.html',
	[string]$outfile = 'table',
	[int]$number = 1 #номер таблицы
)
[net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'
$uri = "http://10.83.3.156/"
$html = iwr $uri
$tables = $html.parsedhtml.getelementsbytagname("table")

# Исключение таблиц, имеющих вложенные элементы TABLE:
$tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{$n=0}{
# Обработка всех элементов TABLE, включая со вложенными (вероятна ошибка структуры таблицы). 
# Необходимо закомментировать строку кода выше и раскомментировать эту:
#$tables|%{$n=0}{

	$headers = @();$n++
	$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]@{
	'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
}

только цикл перебора адресов прикрутить и будет работать...
Сегодня уже лень думать... если что, завтра прикручу.

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


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

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

Отправлено: 19:00, 16-04-2020 | #32


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

fascinating rhythm


Moderator


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

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


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

Вот всё вместе, пробуйте:
Код: Выделить весь код
add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy

$report = @()
$ips = 130..190 |% {"$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")" + $_}

foreach ($ip in $ips) {
    if (Test-Connection $ip -Count 1 -Quiet) {
    $html = (curl "https://$ip/CGI/Java/Serviceability?adapter=device.statistics.device").rawcontent

        if ($html -match "CP-7821") {
        $html = $html -replace "<.*?>",";" -split ';+ ' -replace "^.*;"
        $obj = [pscustomobject]@{'IP' = $ip
           'MAC-адрес'= $html[-18]
           'Номер телефона'= $html[-16]
           'Серийный номер'= $html[-11]
           'Номер модели'= $html[-10]
            }
        }

        elseif ($html -match "CP-6921") {
        $html = $html -split '<tr>' -replace "<.*?>" -replace '&nbsp;'
        $obj = [pscustomobject]@{'IP' = $ip
           'MAC-адрес'= ($html[-18]).trim() -replace "mac-.*`n\s+"
           'Номер телефона'= ($html[-16]).trim() -replace ".*1.*`n.*`n\s+"
           'Серийный номер'= ($html[-12]).trim() -replace ".*`n\s+"
           'Номер модели'= ($html[-11]).trim() -replace ".*`n\s+"
            }
        }
    }
$report += $obj
Clear-Variable html,obj
}

$report |export-csv -Path c:\temp\123.csv -Delimiter ';' -Encoding utf8 -NoTypeInformation

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


Последний раз редактировалось DJ Mogarych, 16-04-2020 в 22:09.

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

Отправлено: 19:36, 16-04-2020 | #33


Старожил


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

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


CP-7821 работает нормально, CP-6921 нет

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


Отправлено: 21:22, 16-04-2020 | #34


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

fascinating rhythm


Moderator


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

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


исправил выше

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

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

Отправлено: 22:10, 16-04-2020 | #35


Старожил


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

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


Цитата DJ Mogarych:
исправил выше »
ура работает, спасибо большое.

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


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


Старожил


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

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


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

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


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

fascinating rhythm


Moderator


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

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


Цитата Griboed0ff:
собирать данные с веб морд принтеров »
Для этого есть специализированное ПО. Полагаю, что и с телефонами оно тоже есть, наверняка с них можно получить информацию не только через HTML, а, например, с сервера, куда эти телефоны подключаются.
В принципе, можно заниматься тем, чем мы тут занимались в этой теме, но это только ради спортивного интереса, в целом это, конечно, костыли.

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


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


Старожил


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

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


Цитата DJ Mogarych:
Для этого есть специализированное ПО. »
да я знаю что оно есть, но задача одним файлом запущенным с пк получить инвентаризационные данные. Модель и серийник мониторов(сделано через бат), мак адрес сетевушки(сделано через бат), данные айпишки (их уже сняли через ps), потом попробую это все слепить во что-то одно.

Отправлено: 08:55, 17-04-2020 | #39


Аватара для YuS_2

Crazy


Contributor


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

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


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

Цитата Griboed0ff:
Парсер мне еще много раз пригодится, например собирать данные с веб морд принтеров, поэтому хочу научиться настраивать его под нужную страничку. »
Ну, собственно, здесь, я попытался сделать то, что можно корректировать под конкретную структуру, это та часть, которая начинается с
Код: Выделить весь код
[pscustomobject]@{
- это формирование хэш-таблицы, в которой дергаются данные из того, что было выбрано парсером.
Т.к. исходный парсер использует все таблицы, то в конечном пришлось добавить параметр номера таблицы (нумерация начинается с 0), в которой находятся необходимые данные. Этот номер сильно зависит от структуры страницы и автоматом его определять сложно, необходима привязка к конечным данным.

Цитата Griboed0ff:
Например сейчас есть потребность снимать данные со странички, у которой есть авторизация. »
Любой парсер будет зависеть от структуры страницы, универсальность в наших костылях - предел мечтаний, так что...

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

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

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



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




 
Переход