Показать полную графическую версию : вытянуть информацию из html полученного через curl
Страниц :
1
[
2]
3
4
5
6
7
8
DJ Mogarych
16-04-2020, 14:10
$ips = 130..190 |% {"$((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")" + $_}
Экспорт в csv:
$report |export-csv -Path c:\temp\123.csv -Delimiter ';' -Encoding utf8 -NoTypeInformation
Griboed0ff
16-04-2020, 14:30
почему то повторяются значения.
DJ Mogarych
16-04-2020, 14:39
Вставьте после $report += $obj
Clear-Variable html,obj
Также, для наглядности добавьте в $obj IP-адрес:
$obj = [pscustomobject]@{'IP' = $ip
'MAC-адрес'= $html[-18]
'Номер телефона'= $html[-16]
'Серийный номер'= $html[-11]
'Номер модели'= $html[-10]
}
Griboed0ff
16-04-2020, 15:06
еще заметил что разные модели имеют разный адрес странички, http://10.83.3.156/ и если изменить адрес на $html = (curl "http://$ip").rawcontent -replace "<.*?>",";" -split ';+ ' -replace "^.*;", то ничего не находит
MAC-адрес Номер телефона Серийный номер Номер модели
--------- -------------- -------------- ------------
HTTP/1.1 200 OK...
Griboed0ff
16-04-2020, 15:26
другие модели имеют другую структуру страничек.
Griboed0ff
16-04-2020, 15:38
Вставьте после $report += $obj »
спасибо работает и вид лучше с ip более понятно.
Griboed0ff
16-04-2020, 15:50
изменил адрес странички, айпишки, которые до этого нормально отдавали данные, даже просто по адресу (http://10.83.3.156/) нормально работает и дальше. Но другие модели не получается снять данные, похоже поиск неправильно работает.
DJ Mogarych
16-04-2020, 18:22
другие модели »
Сколько у вас этих моделей? Я что-то утомился уже, не ожидал, что придётся тут целый проект мутить на коленке.
А как это батником вы собирались реализовывать, вообще уму непостижимо.
Griboed0ff
16-04-2020, 18:45
две модели у нас, у второй просто другой адрес, структура поменялась и получается парсер не срабатывает. Я так понимаю дело в $obj = [pscustomobject]@{'IP' = $ip
'MAC-адрес'= $html[-18]
'Номер телефона'= $html[-16]
'Серийный номер'= $html[-11]
'Номер модели'= $html[-10]
} »
в цифрах в конце строк -18 -16 -11 -10, но не могу понять как это работает, чтобы подогнать под другую страничку, слова поиска совпадают так же адрес номер серийник модель.
DJ Mogarych
16-04-2020, 18:49
Ладно, две попробуем.
Надо эти HTML-файлы парсить по-разному, там даже в одной и той же таблицы тэги отсортированы по-разному, вот, например, в нужной таблице:
Первая модель - <table cellspacing="10" cellpadding="0" border="0">
Вторая модель - <TABLE BORDER="0" CELLSPACING="10" CELLPADDING="0">
Griboed0ff
16-04-2020, 18:50
А как это батником вы собирались реализовывать, вообще уму непостижимо. » скорее всего костылями, оставил бы для начала только строку с нужными данными, потом начал бы удалять данные от html типа тегов, потом бы пробовал бы посимвольно копировать нужное. Так сложно получилось, потому что пришлось получается весь батник переписать для ps. осталось немного, понять как настроить парсер.
Надо эти HTML-файлы парсить по-разному, там даже в одной и той же таблицы тэги отсортированы по-разному »
то есть получается парсер настраивается даже не в цифрах на конце строк?
Я что-то утомился уже, не ожидал, что придётся тут целый проект мутить на коленке. »
Кстати, тут может пригодиться тот парсер таблиц (http://forum.oszone.net/post-2915883.html#post2915883)
Чуток изменить его под задачу и вполне сгодится:
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
}
только цикл перебора адресов прикрутить и будет работать...
Сегодня уже лень думать... если что, завтра прикручу.
DJ Mogarych
16-04-2020, 19:36
оставил бы для начала только строку с нужными данными »
Отличный совет, только строки в этом последнем 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 ' '
$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
Griboed0ff
16-04-2020, 21:22
CP-7821 работает нормально, CP-6921 нет
DJ Mogarych
16-04-2020, 22:10
исправил выше
Griboed0ff
17-04-2020, 08:18
исправил выше » ура работает, спасибо большое.
Griboed0ff
17-04-2020, 08:33
только цикл перебора адресов прикрутить и будет работать...
Сегодня уже лень думать... если что, завтра прикручу. »
Подскажите, а что изменится? смогу ли я, например, пропарсить странички с другой структурой? насколько с понял парсер извлекает данные со странички, а потом уже можно из них дергать, то что нужно. Парсер мне еще много раз пригодится, например собирать данные с веб морд принтеров, поэтому хочу научиться настраивать его под нужную страничку. Например сейчас есть потребность снимать данные со странички, у которой есть авторизация.
DJ Mogarych
17-04-2020, 08:45
собирать данные с веб морд принтеров »
Для этого есть специализированное ПО. Полагаю, что и с телефонами оно тоже есть, наверняка с них можно получить информацию не только через HTML, а, например, с сервера, куда эти телефоны подключаются.
В принципе, можно заниматься тем, чем мы тут занимались в этой теме, но это только ради спортивного интереса, в целом это, конечно, костыли.
Griboed0ff
17-04-2020, 08:55
Для этого есть специализированное ПО. » да я знаю что оно есть, но задача одним файлом запущенным с пк получить инвентаризационные данные. Модель и серийник мониторов(сделано через бат), мак адрес сетевушки(сделано через бат), данные айпишки (их уже сняли через ps), потом попробую это все слепить во что-то одно.
смогу ли я, например, пропарсить странички с другой структурой? насколько с понял парсер извлекает данные со странички, а потом уже можно из них дергать, то что нужно.»
В исходном скрипте парсятся таблицы и конвертируются в csv. Таблиц на страницах может быть несколько, а также они могут иметь вложенную структуру. Со вложенными таблицами - не всё просто, их парсер разобрать вряд ли сумеет, только можно исключить из разбора и парсить только конечные, которые не имеют вложенных элементов TABLE.
Если структура требуемых страниц отличается, то естественно, придется скрипт корректировать... т.е. так, чтобы была полная универсальность, в костылях сделать не получится...
Парсер мне еще много раз пригодится, например собирать данные с веб морд принтеров, поэтому хочу научиться настраивать его под нужную страничку. »
Ну, собственно, здесь (http://forum.oszone.net/post-2917506.html#post2917506), я попытался сделать то, что можно корректировать под конкретную структуру, это та часть, которая начинается с
[pscustomobject]@{
- это формирование хэш-таблицы, в которой дергаются данные из того, что было выбрано парсером.
Т.к. исходный парсер использует все таблицы, то в конечном пришлось добавить параметр номера таблицы (нумерация начинается с 0), в которой находятся необходимые данные. Этот номер сильно зависит от структуры страницы и автоматом его определять сложно, необходима привязка к конечным данным.
Например сейчас есть потребность снимать данные со странички, у которой есть авторизация. »
Любой парсер будет зависеть от структуры страницы, универсальность в наших костылях - предел мечтаний, так что...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.