По какой причине мой скрипт Powershell теперь возвращает ошибки выражения с нулевым значением? - PullRequest
0 голосов
/ 02 марта 2020

Как видно из заголовка, у меня есть скрипт, который я запускаю ежедневно, чтобы анализировать таблицы с веб-страницы и экспортировать их в csv. Спустя несколько дней go я понял, что скрипт возвращает следующие ошибки:

You cannot call a method on a null-valued expression. At C:\Users\Luke\DailyStats\NHLStats.ps1:16 char:1
+ $headers = $rows.item(1).children | select -ExpandProperty InnerText
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull   Cannot index into a null array. At C:\Users\Luke\DailyStats\NHLStats.ps1:23 char:14
+ $headers = @($headers[0];'TEAM';$headers[1..($headers.Length-1)])
+              ~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray   Cannot index into a null array. At C:\Users\Luke\DailyStats\NHLStats.ps1:23 char:33
+ $headers = @($headers[0];'TEAM';$headers[1..($headers.Length-1)])
+                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Я не понимаю, почему вдруг он случайно перестал работать. Любая помощь очень ценится.

Мой сценарий:

$url = "https://www.hockey-reference.com/leagues/NHL_2020.html"

#getting the data
$data = Invoke-WebRequest $url

#grab the third table
$table = $data.ParsedHtml.getElementsByTagName("table") | Select -skip 2 | Select -First 1


#get the rows of the Team Statistics table
$rows = $table.rows

#get table headers
$headers = $rows.item(1).children | select -ExpandProperty InnerText
#$headers = $headers | % { if ($_ -eq "GF") { "GFPG" }  else { $_ }}

#count the number of rows
$NumOfRows = $rows | Measure-Object

#Manually injecting TEAM header and replace any headers you want to change
$headers = @($headers[0];'TEAM';$headers[1..($headers.Length-1)])

#enumerate the remaining rows (we need to skip the header row) and create a custom object
$allData = @{}
$out = for ($i=2;$i -lt $NumofRows.Count;$i++) {
 #define an empty hashtable
 $objHash=[ordered]@{}
 #getting the child rows
 $rowdata = $rows.item($i).children | select -ExpandProperty InnerText 
 for ($j=0;$j -lt $headers.count;$j++) {
    #add each row of data to the hash table using the correlated table header value
    $objHash[$headers[$j]] = $rowdata[$j]        
  }

  #turn the hashtable into a custom object
  [pscustomobject]$objHash
  $allData.Add($i, $objHash)
}

$out | Select TEAM,AvAge,GP,W,L,OL,PTS,PTS%,GF,GA,SOW,SOL,SRS,SOS,TG/G,EVGF,EVGA,PP,PPO,PP%,PPA,PPOA,PK%,SH,SHA,PIM/G,oPIM/G,S,S%,SA,SV%,SO -SkipLast 1 | Export-Csv -Path "C:\Users\Luke\DailyStats\$((Get-Date).ToString("'NHL Stats' yyyy-MM-dd")).csv" -NoTypeInformation

1 Ответ

0 голосов
/ 02 марта 2020

Похоже, ваша переменная $table возвращает null. При запуске этого |select -skip 2 | select -first 1 он не возвращает никаких данных в переменную $table.

Похоже, это связано с выбором -skip 2 . При запуске только части $table = $data.ParsedHtml... Он возвращает только два объекта.

Так что, возможно, вам нужно обновить свой выбор, чтобы правильно получить таблицу, которую вы хотите?

Я вижу только Таблицы «турнирная таблица EAS» и «турнирная таблица WES» тянутся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...