我有以下PowerShell脚本:
$Top40 = @()
$Top40Response = Invoke-WebRequest -Uri 'https://www.radioinfo.com.au/knowledge/chart'
$Top40Entries = $Top40Response.ParsedHtml.getElementsByTagName("tr") | Where-Object {$_.className -eq 'layoutTr'}
$Top40 = $Properties = @{
position = ($Top40Entries.getElementsByTagName("td") | Where-Object {$_.className -eq 'twRank'}).innerText
artist = ($Top40Entries.getElementsByTagName("td") | Where-Object {$_.className -eq 'artist'}).innerText
title = ($Top40Entries.getElementsByTagName("td") | Where-Object {$_.className -eq 'title'}).innerText
}
New-Object -TypeName psobject -Property $Properties
$Top40
运行此脚本然后在最后运行 $ Top40 时,会列出我需要的结果,但是它会将结果分组到每个属性的同一行像这样http://screencast.com/t/rge78fYwL6V。因此,我不想在三个属性中的每个属性的同一行上列出结果,而是希望将结果列在另一个之下,例如3个包含结果的漂亮列。我错过了什么。
答案 0 :(得分:1)
问题是你没有将结果分解为个人。这里有一个循环应该解决这个问题。我不擅长HTML解析(因此可能会有其他改进),但从我所看到的艺术家们都按顺序进行了解析,所以让我们有这个功能。
WebDriverWaits._SeleniumRealWaitByInputType(driver, "submit");
该代码将产生40位艺术家和40位作品。使用简单的计数器数组$Top40 = @()
$Top40Response = Invoke-WebRequest -Uri 'https://www.radioinfo.com.au/knowledge/chart'
$Top40Entries = ($Top40Response.ParsedHtml.getElementsByTagName("tr") | Where-Object {$_.className -eq 'layoutTr'}).getElementsByTagName("td")
$artists = ($Top40Entries| Where-Object {$_.className -eq 'artist'}).innerText
$titles = ($Top40Entries| Where-Object {$_.className -eq 'title'}).innerText
$Top40 = 0..39 | ForEach-Object{
[pscustomobject][ordered]@{
Position = $_ + 1
Artist = $artists[$_]
Title = $titles[$_]
}
}
,我们构建了40个对象以获得所需的输出。
由于您使用的是3.0,我们可以使用强制转换0..39
而不是担心New-Object语法,我们只使用管道来填充[pscustomobject][ordered]
。数组基于0,因此我们通过将$top40
增加一来来解释这一点。
如果我们查看前3次点击,这是我们现在获得的样本
Position