这个网站https://ideone.com/GwB7Ba我试图使用Invoke-WebRequest从中获取前50首歌曲, class =“item-title”和中有两个类class =“artist-name”我需要获取元素来收集正确的信息。
$top50raw1.ParsedHtml
然后我用:
$top50raw1.ParsedHtml.getElementById('dvChartItems')
$top50raw1.ParsedHtml.getElementsByTagName('div')
可以选择 getElementById , getElementsByName 和 getElementsByTagName 以及ID dvChartListingContainer 和 dvChartItems
即使使用以下任何一种:
{{1}}
不起作用,我不确定如何使用网站中的正确元素来捕获正确的数据。
答案 0 :(得分:1)
我使用Internet Explorer和RexEx的集团以不同的方式解决了这个问题。
$titles = $null
$artists = $null
$ie = New-Object -comObject InternetExplorer.Application
$ie.navigate('http://www.ariacharts.com.au/chart/singles')
Start-Sleep -Seconds 5
$rawtop50 = $ie | Select -ExpandProperty document
$titles += $rawtop50.getElementById('dvChartItems').innerHTML | Select-String -Pattern 'title="(.*?)"' -AllMatches | ForEach-Object {$_.Matches} | ForEach-Object {$_.Groups[1].Value}
$artists += $rawtop50.getElementById('dvChartItems').innerHTML | Select-String -Pattern 'artist-name[\s\S]*?data-reactid="[\s\S]*?">(.*?)<\/' -AllMatches | ForEach-Object {$_.Matches} | ForEach-Object {$_.Groups[1].Value}
$top50 = 0..49 | ForEach-Object{
[pscustomobject][ordered]@{
Position = $_ + 1
Song = $artists[$_] + " - " + $titles[$_]
}
}
答案 1 :(得分:0)
使用InternetExplorer.Application确实解决了在Invoke-WebRequest的ParsedHtml中未找到“DIV”内容的问题。但我确实发现你收集数据的方式效率低下。两次调用'getElementByID',然后对数组进行循环以将它们聚集在一起似乎是'iffy'..
在我看来,一次查看一个'行/排名',以正确收集排名/艺术家/标题,保证数据彼此属于。此外,它加快了这个过程。
我在你的剧本上做了一个测量命令,而不是我的,我来了~3.5秒,平均为5.5秒。
希望这可以帮助您或任何想要解析HTML内容的人。
$ie = New-Object -comObject InternetExplorer.Application
$ie.navigate('http://www.ariacharts.com.au/chart/singles')
While ($ie.ReadyState -ne 4) { Sleep -Milliseconds 100 }
$ChartItems = ($ie.Document).getElementByID('dvChartItems')
ForEach ($Row in $ChartItems.childNodes) {
$Rank = $Row.childNodes[0].childNodes[1].outerText
$Title = $Row.childNodes[2].childNodes[0].outerText
$Artist = $Row.childNodes[2].childNodes[1].outerText
[PSCustomObject]@{ Rank = $Rank; Title = $Title; Artist = $Artist }
}